动态规划小结

准备青岛的征途,拿着部分DP题搞了一波,收获还是很多,部分常见的DP并没有刷题,偏重于记忆化搜索,状态压缩,区间DP,博弈+DP,树形DP。还是做题少,做什么都力不从心,好多题不看题解根本就不会做,看了题解也要研究半天,没办法嘛,人丑就要多读书呗。是时候来总结一下,数数最近是否还有收获。


自己开了一套题,水题有,难题也有,六天终于搞完,还有很多没涉及的方面,来日方长。


扔一下题目地址吧,万一有人做呢。传送门:点击打开链接


下面总结一波!咳咳咳。


首先怎么也要放点水题增加信心,没想到水题对于我来说一点也不水,毕竟英语菜的掉渣。第一题是个关于最长公共子序列的,这么水的题,竟然读错题意,幸亏示例都不对,做题的时候再简单的题也要读一遍,防止小细节的坑,看示例猜题意确实有点不靠谱,但愿比赛当天人品爆发,看的题都懂,懂的题都会。


然后理所当然的要找到背包,看了看背包九讲的前三个,0-1背包按常理出牌,没有什么太大的发现,完全背包还是难以逃脱两层循环,但多重背包却有收获,发现了一种单调队列优化的方法,时间稍微有优化,那就讲讲先。多重背包首先正常人的的思维就是dp[i][j]=max(dp[i-1][j-k*c[i]]+k*w[i],dp[i][j]),意思就是第i-1个物品放置东西,加上价值。深入思考一下,令a=j / v[i] ,b=j% v[i],得到j=a*v[i]+b. 然后用k表示取第i件物品时比a少的件数,得dp[i][j]=max(dp[i-1][b+k*v[i]]-k*w[i])+a*w[i],要求a-v[i]<=k<=a.此时,物品的最大值只跟k有关,而k在某个区间内是连续的,所以题目就变成了求k在区间内的最大值。然后区间用队列优化,网上代码很多,就不用我放模板了,K题可以用队列优化。


接着试了试LCS,有意思吧,LCS这么简单也要做题?首先LCS需要二维DP来储存值,那么当n>=2000的时候怎么开数组?尴尬了吧,还是要优化,当然LCS空间优化无非就是滚动数组,因为当前状态只与前一状态有关,所以滚动数组轻轻一搞就OK了。


该有点难度了,于是来了一波记忆化搜索,瞬间不在状态。每做一个题,都在感叹:我去,研究出这种写法的人真神奇,这都能想得到。先做了一道新题,求矩阵内的最长递减路径的长度,我是真没接触过类似的题,完全蒙蔽。其实就是正常不过的记忆化搜索,每个点都搜一遍,得到最大值,在搜索的时候,首先要封顶,若是dp[x][y]有值就返回,有的题目还需要加一个visit标记。然后定义一个ans,接收返回值并且作为返回值,还有意想不到的效果,比如石子那个区间DP,记忆化搜索的时候用到ans=12,若是最后没变,则直接进行判断枚举,然后for一下,然后更新ans,然后返回ans,然后就没有了然后。


DP当然要搞一波状压来刺激一下,状压当然要配合记忆化搜索,区间DP,博弈搞一波。然后才发现,状压真是个神奇的东西,代码量直线下降。状态只能是具体题目具体分析,然后各种位运算。首先&运算,大多数情况是判断两种状态是否一致的,也可以枚举出特定状态,这就是状压神奇的地方。|运算基本都是凑出总的状态,达到都为1的效果,^运算更加神奇,可以配合for循环枚举出子状态或者是前一状态。状压一定要注意位运算的优先级,最好是能加括号的地方都加上括号。


然后是博弈,天真的以为博弈就那三种或者是找规律,没想到博弈会跟DP牵扯到一块,还是多数是区间DP,区间DP我喜欢用记忆化搜索写,然后博弈就成了难点啊,首先公式就要推好久的感觉,但是重要清楚,就是博弈,博弈就是不管别的状态如何,当前的决策一定是最优决策,多数博弈是从最后的状态向前推,因为多数的最后状态是确定的。多数博弈题并不知道怎么做,博弈不是很懂导致DP很难做,今后有机会再补补吧。


树形DP,伴随着树的遍历而进行的DP,类似于记忆化搜索,可以解决最小点覆盖问题以及最小支配问题,在解决最小支配问题的时候,可能会用到一个定理,此定理可以将三维DP直接优化为二维。有两个所求的值要优化,比如让a尽量小,b也尽量小,那么可以转化为让 M*a+b尽量小,其中M应该是一个比“a的最大值和b的最小值之差”,还要大的数最终的答案为ans/M, ans%M。


这段时间的DP就到这里吧,比赛的时候还是要看一部分的运气,或许 用得到,或许以后用得到,接下来准备 搞一波polya定理,又是属于完全搞不懂系列。慢慢来吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值