关于dp的学习

    二进制优化

    假设背包问题一个物品有8个,我们可以发现可以把这八个分为 1,2,4,1;无论最后选几个(1—8)都可以从这几个数字中选出,也就不需要1,2,3,4,5,6,7,8个一次次的dp了。

也就是把n个分为2的零次方,2的一次方,……和多出来的。这样复杂度减少了很多。

    状态压缩dp

    通俗的说,即用0010100(二进制)的第n位表示第n个东西取还是不取。

    如果这些二进制用十进制表示的话就只有 一个维度了。而且这一个维度能表示所有物品放与不放的情况;这个过程就叫做状态压缩。

    例题:poj的2411.

    题目大意:给出一个n*m的棋盘,问用1*2的多米诺骨牌将其完全覆盖有多少种不同的方案。

    n和m最大都只有11。

    

如果当前格没有被覆盖,说明我们至少可以放一个1*2的方格,如果当前列的下一行也没有被覆盖,那么我们可以放一个

2*1的方格;如果被覆盖, 那么我们继续往当前列的下一行遍历 ,直到把这一列遍历完; 在这个过程中 ,我们能求出

下一列的合法状态(也就是可以到达的状态),这是一个搜索的过程。

具体可以看大佬的分析:https://blog.csdn.net/u013377068/article/details/81054112,太强了QAQ

 

    

你可能感兴趣的:(动态规划,dp)