动态规划的总结分析

                                     专题总结之——动态规划

动规学了这么长时间,结果觉得自己其实并没有什么长进,但自己好歹也做了几道经典动规,
那么我们就要来总结一下
先总结一下那些经典例题
(1)01背包问题问题
想法思路;
1.动规要把大问题化成小问题,那么我们就把物品一个一个加入背包,一件物品只有两种情况,加,或者不加
如果要加,那肯定是在上个状态的最优解的情况下加, 能加的情况下上一状态就是 背包体积为 当前体积减去 物品体积
如果不加,那上一状态就是未加此物品的时候;
2.那么  状态转移方程可以写为     dp[j]=max(dp[j].dp[j-v[i]]+p[i]]
其中V表示第i件物品的体积,P表示价格

(2)完全背包问题
想法思路;
1.把大问题化为小问题,我们一件一件添加物品进背包,一件物品有无数种状态  可以取用1次,2次,3次
那我们该如何办,想想01背包吧;
01背吧只能放一个,第二个for循环是倒序,这样可以防止一件物品选多次
那么我们来正序搞,这样一件物品他就可以选用多次
2.为什么会这样那?我们来分析一下;
我们每次更新最优解的时候是用的前面的值,
如果我们倒序,那么更新过的解会在 标记的 后面,我们再更新新的最优解的时候就不会用到它
而相反,如果我们正序,更新过的解会在标记的前面,我们再更新最优解的时候可能会用到它
而用到的最优解可能在更新自身的时候就已经用过一次当前物品了,而我们此时还有可能再用
这样一件物品就可能用多次,如果背包无限大,那么这件物品就会被用无限次


(3)多重背包问题
思路想法;
其实就是把它转化为我们已经了解的01背包
把因为这件物品有M件,那么我们就拆分成M个
但是这样也太费时间了,那么我们就用投机一点的拆分方法
具体方法见多重背包

(4)字符串匹配
思路想法;
1.输入了 s1 s2 之后进行比较,那么动规还是大问题弄成小问题
这题用二维做的话我们首先要明白二维里面每个位置代表什么意思
如第二排第二列  表示的是  s1输入2个 s2 输入2个(开的二维数组第一行和第一列空下不用)
时的最优解
那么对于每个字母,也只有两种情况,匹配与不匹配
如果匹配了 那么它的上一状态为左上角的  那么就是左上角 +1
如果不匹配了  那么它的上一状态有两个,是上面的  与左面的
一定是两个,如果不是两个,那么将字符串输入顺序换一下,那么就错了
不信自己举组样例,然后再打表试一试,这里就不再写了
那么状态转移方程为;
if(s1[i]==s2[j])
      dp[i][j]=dp[i-1][j-1];
if(s1[i]!=s2[j])
      dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

(5)单调递增(递减)子序列
思路想法;
这道题是这经典题里面思路最好想的
这道题同理,一个一个输入,输入后记录下当前的最优解
问题就是  如何找当前的最优解
因为保证前面的都是最优解,我们可以随时调用,
每输入一个,那么就从前面从头找一遍,如果发现前面有更小的
那么我们找一个比当前值小的,而且最优解最大的,这样我们再+1
就找到了当前的最优解,怎样,思路是不是很简单,


大总结;
动规是把所有可能的解都存起来,以便以后更新最优解时使用
我们所要做的就是
(1)找到上一个状态
(2)利用找到的上一个状态更新当前状态(利用状态转移方程)










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值