以前没做过状态压缩的题目,今天是见识了,我看下下面这段精辟的话才做出来的. -_-
本该很早就ac的题一直调到现在,why?这次真的是自己的状态很差的原因啊!
下午看了一份报告,其他人有dfs的方法,其中有个同学和我是思路一模一样,但是我的数据都没过,思路一开始就对的,错在一个很小的条件判断,很伤人啊,还以为自己的dp找错了呢!看来还要相信自己的实力的。
算法我觉得慢简单的,和我上午ac的一个题思路没什么区别,就是每行取二进制状态。
设dp[i][k]为第i行状态值为k时的ways。那么找出它与第i-1行的状态之间的关系即可。
由于在做第i行dp时必须完全覆盖第i-1行,只要抓住这个条件不放就行。
1、如果第i行中有0,则第i-1行一定为1;
2、如果第i行中为1的x列第i-1行为0,说明第i行肯定是竖着放的;
3、如果第i行中为1的x列第i-1行的该列也为1,可能性只有一个,第i行是横放的,所以第i行的x+1列也必须为1,又因为第i行的x+1列为1是因为横着放的,所以第i-1行的x+1列也必须为1。
找到了关系就很简单了。哎呀,一想到这里我就不爽,本该恨早就ac的。
哦~,差点忘了,还有初始化的第1行,将它初始化为只存在横着或者不放。
本段原话引自: http://gisyhy.blog.163.com/blog/static/129390343200992441558735/
ps: 原作者的代码写得很优美.哇咔咔.
状态压缩DP实战解析
本文通过一道具体的题目详细解析了状态压缩动态规划的实现过程,包括状态定义、转移方程及边界条件等,并分享了作者从调试到最终AC的心路历程。
103

被折叠的 条评论
为什么被折叠?



