动态规划的学习总结

这几天学习动态规划,我的理解是DP大致可分为2类,一种是自下而上(也叫递推),另一种是自上而下(就是递归,类似DFS)。这两种方法都可以达到目的。

自上而下通常要用到记忆化搜索(memorization),也就是用一个专门的数组来标识已经计算过的状态,否则就会有大量的重复计算,复杂度就是O(2^n)了。

注意:
1) 自上而下的计算只包括实际所需的那些状态点。
2) memorization可以用一个单独的数组vis[]来表示某状态是否已经访问(1:已访问,0:未访问)。vis[]初始化为0即可。如果状态比较复杂,可以用STL里面的map来保存状态值(不需要vis了),这样判断状态S是否算过只需用if(d.count(S))就可以。
3) 如果dp(S)里面发现无法到达终点,应该返回一个特殊值(比如说算最小值的话返回INF,或算最大值的话返回-INF),而不能返回0,-1之类的值。


自下而上的话,计算通常包括所有的状态点,有些并不需要。有时可以用刷表法。
自下而上通常是一个或是两个循环。如果是两个循环(i,j)的,其中最外层i的循环又分逆序和正序两种情况(注意最内层的循环次序无所谓)。

先写这么多,下次再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值