dp,状压dp等 一些总结

也就作业几题而已,分析一下提醒

最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态。

几种思考方向:

第一种:枚举当前的状态,转移成另外一个状态

第二种:枚举最终状态,然后通过另外一个枚举能转移到这种状态

①就是给你一个地图,然后这个图上面1的可以放东西,0的不能放,问一共有n个东西,每个东西只能放在特定的几个位置上,最多有几种?POJ2441

这个问题就是,因为地图之间的每个空间都是很大的,如果只是普通的dp是无法进行状态转移的,因此这道题就是状压dp(当然数据小的话也是一种标志),然后接下来就是从上到下,然后枚举状态即可。(把上面一行的所有的状态的可能性都放过来,是从上面一种状态转移到另外一种状态)

②所有的种类问题,给你一个地图,地图上面1可以放东西,0不能放,一个有多少种放法?(放东西的次数可以为1,2,3,4...到无穷)POJ3254

这道题目虽然和上面这个题目很像,但是由于可以任意放,所以又有点变化,和第一类的主要区别在于,目前所在的这个状态是上一种条件下能够满足加入这个状态的所有状态的和

③铺砖问题UVA11270

这一类问题是轮廓线dp,但是就是状压dp的变种。

就是给你一个矩阵n*m,再给你方块,问你有多少种情况能铺满整个矩阵?

我们就是不断的递推目前的dp,然后dp的每一维的长度都是1<<m,然后我们只需要每次从上往下移位,然后转移的时候判断能否往上、往左、往下、往右、或者不放即可(当然只是其中的几种,看你怎么推了),然后最后因为矩阵满足的状态是所有被覆盖嘛,因此答案就是你目前所在的pos和(1<<m)-1

④覆盖问题 POJ2836(当然个人感觉这道题目的数据太水了。。。我的代码以奇怪的姿势都过了。。。)

给一个图,图上有n个点(都在图的线的交叉处),然后有任意大小的矩阵无穷多个,要让这些矩阵铺满所有的点(每个点可以被覆盖多次),问,覆盖掉所有的点所需要的矩阵的最小面积是多少?

我们可以得到以下的情况,我们枚举n个点,制造n*n个矩阵,然后分别要知道矩阵内部(含边界)有几个点,最后dp[s]得到就可以了

 ⑤罚时问题 HDU1074(逆向思考有时是dp的一把刀韧

一个人作业没做完,每个作业有限定的期限,但是如果你不在这个限定的期限内做完的话,每过一天扣一分,然后给你n门科目,怎么做才能让自己的分数损失为最小?

首先这个是一维的状压DP,一维的状压DP有如下特点:之前的状态转移了以后就没有其他作用了

然后采用一维有以下几个特征:数组中保存的是之前的状态,更新的是目前的状态

 然后这道题的关键点就在于逆向思考:我们在寻找状态的时候,如果说,你目前的状态转移出去有多个状态且这多个状态都需要用到的时候,不如反过来思考,我们定义好状态,然后看看能否向目前的这个状态转移
不相交子序列的最大值问题,子序列里面的数字是要连续。(HDU1024)
kuangbin同志的题解http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html
定义dp[i][j],分成i组,到第j个,然后状态转移:dp[i][j] = a[j]包含在第i组里面,还是自己独立成组

状压dp里面很需要剪枝,然后一下有几种剪枝的可能性

①先枚举状态,再枚举所需要的另外一维。所以这个不剪枝的复杂度是O(状态的种类*另外一维的大小),然后这个时候把没用的状态给continue了就好了,那么多的状态里面肯定会消去很多种状态的,所以复杂度会下降的很快 。例如POJ2441

②如果你需要枚举之前的状态和目前所在这一行的状态的话,单纯的暴力枚举是TLE的。这个时候题目一般会告诉你每个状态之间都会有条件,而且这个条件都会把剩下来的状态变得很小,然后再暴力就好了。例如POJ3254

原文地址:https://www.cnblogs.com/heimao5027/p/5637906.html