粉丝33.5万获赞174.6万

大家好,今天我们来聊状态压缩。 d p 的 核心基础为运算与集合的对应关系。看这四个位,分别对应 bit 三到 bit 零,值为一的位,代表元素在集合中,这里 bit 零 bit 二, bit 三为一,所以集合 s 等于零二三,实际质值就是十三。 这四种操作是撞压的基本功。检查 dj 为用右移再与一,加入用或运算移除用与非。自己每举有一个经典的简易再与的技巧,记住这些,后面全靠它们。 现在来看子集美举最精妙的技巧。假设 s 等于一千零一十一,也就是集合零一三,用 sub 等于 s 开始,每次 sub 减一,再于 s, 就 能按降序便利所有子集。看一千零一十一变幺零幺零, 再变一千零一 一千,最后到零零零零空记,整个过程跳过了不属于 s 的 位,非常高效。 来看一道经典应用题,有 n 个工人和 n 个任务,每人做不同任务的代价不同,要求每人恰好做一个任务,求最小总代价,这是四个工人四个任务的代价。矩阵暴力,每举所有排列是 n 阶乘,但用撞压 d p 可以 降到 n 乘以二的 n 次方。 定义 d p s 为前 pop contest, 各工人分配了任务集合 s 时的最小代价,转移时每举 s 中的每个任务 j, 从 d p s 去掉 j, 加上当前工人做任务 j 的 代价转移过来,取最小值 来实际跑一遍。左边是代价矩阵,右边是 d p。 状态初始 d p 零零零零等于零, 工人零分别分配到任务零一二三,代价就是矩阵第一行九二七八。工人亦从 popcount 等于一的状态转移,比如状态零零幺幺表示任务零和一都分配了 d p 值等于 d p 零零零幺加 cost 一 一或 d p 零零幺零 加 cost 一 零取较小值层层推进,最终 d p 幺幺幺幺就是所有任务都分配完的。最有解 来看,完整的 c 加加实线核心就十几行。读入代价矩阵后,初识化 d p 数组, d p 零等于零。外层每举所有状态 s, 用 popcount 算出当前是第几个工人。内层每举 s 中的每个任务 j 前驱状态就是 s e 或一左一 j。 转移方程一行搞定。时间复杂度 n 乘以二的 n 次方,空间两的 n 次方。此题方向很多, esp steiner 树,最小权匹配、集合覆盖都是同一套子级媒局框架,掌握了这个模板,一通百通。

你好,一分钟学习一道奥数题,求二进之数,把十进之数三十八改成二进之数。二进之数最大的特点就是每个数的各个数位上只有零或者一两种状态。我们把十进数改成二进之数的最强的方法是除以二倒取余数法。 把三十八改成二进制数呢?首先要根据二进制满二进一的一个原则啊,我们用二连续去除这个十进制数, 直到商为零为止,然后再把每次所得的这个余数呢,按照一个相反的顺序倒着去写出来,啊,啊,就可以得到这个二进之处了。 那么我们把这种方法称为除以二倒取余数法。好,我们来解一下这道题。你看,三十八除以二,那么他的余数是零,然后除以二之后呢?是十九,再用十九呢, 除以二,他的余数是一啊,余数是一,然后十九除以二等于多少等于九,对吧?商是九,你看,然后再用九除以二啊,注意了,这边九呢,除以二的余数还是一啊,那么这样九除以二,得到四啊,四除以二, 哎,他的余数是几啊?是零,那么四除以二的商啊,写这里啊,商写这里啊,那么再用二再除以二, 得到了这个余数啊,是零,那商是一,一写下面,然后一呢?没有办法再除了,一就是余数啊,一就是余下来这个一啊,就可以了,那么这里就出完了啊,那这个时候呀,我们再把右边的 这一列这个数字啊,倒过来写,就是三十八转换成的二进之数,也就是幺 幺零零幺幺零,你看,所以三十八十进制数,把它转化成二进制数,就是幺零零幺幺零,你学会了吗?好了,这节课就讲这里,希望对你有帮助,谢谢。

硬说我听不懂,他给我讲六的二次二进制,六的二进制,二进制就是逢二进,一进一位就跟十进制逢九逢十进一位是一样的。第一位是一,当当数到二的时候就进一位,进到十位就是一零 一零二,各位只有零零一,没有二。然后一的话就是 一,二的话就是一零要进一位。你告诉我六的二级是怎么算一个数啊?三的话就是一四的话,这边各位一要冒了又往前进一位,这又是零,就是幺零零就是四, 五的话就是幺零幺六的话再进一位就是幺幺零。咋算的?不是警察吗?

来一秒教会你二进制转十六,进制十六刚好等于二的四次方,所以我们可以把四个数字为一组, 每一个都是前二的倍数。来,我们上面的数字列下来,标上八四二一,前面十不足一直,所以要补零,并已经看出它的规律了,只保留一上面的数加起来就是答案,零零一零等于二,零一零一等于五,那我们来验算一下,答案就是 b。

哈喽,大家好,我们呐都是生活在一个到处都是计算机的时代,而计算机呢,他的算法就是二进制, 也就是说他只会算零和一二进制下的一零一一。我们如何把二进制转换成实进制呢?首先我们需要搞明白实进制是什么来的? 比如我们随便举一个一二三吧,一代表什么?一是不是就是一乘上一百,而一百是不是就是十的二次方?然后那二是不是二乘十,也就是十的一次方, 那三呢?三是三乘一,也就是十的零次方,所以我们可以看出它的净值,它这个怎么算来的呢? 就是它单位这个数,当前的位数,然后乘上我们的这个净值, 然后头顶上这个小标呢,就是零一二三四,对不对?我们掌握了方法,是不是算这个就很好?简单的,因为二进纸嘛,他也一样的。其实上,然后我们再来看二进纸,我们也是可不可以从零也标着走 零一二三四,我们就从这一位开始算,这一位呢?他代表的一乘 我们的二禁止的四四次方,对不对?然后再加上我们也把它写出来吗?二的三次方,然后我们继续递增下去,继续加下去 二次方,一乘二的一次方加一乘二的零次方,对不对?然后我们继续把它算, 就是二十三,对不对?它转换成实心式就是二十三。