四周学习总结-dp

这周主要是学习动态规划,在这周的学习当中,接受这个知识比较困难,导致在解题方面不知从何下手,也就是状态转移方程不会找,所以解题数不够。
1.动态规划的一般解题步骤
a.判断问题是否具有最优子结构性质,否则不能使用;
b.把问题分成若干字问题(分阶段);
c.建立状态转移方程(递推公式);
d.找出边界条件;
e.将已知边界值代入方程;
f.递推求解;
2.对列题的思考
a.最长上升子序列
描述:给定一个序列,求出最长上升子序列长度。
我的思考
1.此问题是求最值可以使用动态规划解题;
2.找边界条件,什么是边界呢?找的是子序列的长度,那么子序列的结束,也就是最后一个元素是边界;
3.要建立状态转移方程,那么把什么看作状态?从序列的特征来看,那么可以表示状态的就是位置;那怎么找状态转移方程呢?序列中数的位置为k的话那么位置k的值对应的就是子序的终点,也就是边界;
遇到问题:怎么找状态转移方程;
题解和我的理解
假定maxl(k)表示为以ak为终点的最长上升子序列的长度,那么:
maxl(1)=1; //只有一个数,那么他的子序列就为他自己,长度为1;
maxl(k)=max{maxl(i):1<i<k且ai<ak且k!=1}+1; //我的理解是k位置的值比i位置的值大那么i结尾的子序列就可以加上k位置的元素,子序列长度加1;

b.最大字段和问题
描述:给定N个绝对值不大于1000的整数组成的序列a1,a2,…,an,求最大子段和,且字段是有序列中连续取出的。如果序列全为负数,那么为0;在这里插入图片描述
我的思考
1.首先这是一个求最大字段和的问题,也是一个最值问题,同时也可以分成子问题来求解,所以符合使用动态规划来解的要求;
2.进行状态设计,同上个题,这题的状态还是和位置有关,可用dp[i]来表示以a[i]结尾的最大连续字段和,那么根据这个进行求解的时候,就可以从最后一个元素开始利用递归;
3.边界?由于是从最后一个元素开始从前考虑,那么边界就是i=1的时候,只有这一个元素的话,那么如果为正,那么取他,如果为负那么取0;
题解和我的理解
状态建立:用dp[i]来表示以a[i]结尾的最大子段和的出有dp[i]>=0; //这就找到了用状态来表示需要求解的目标;
求解目标:max{dp[i]} //最大子段和;
状态转移方程(难点):dp[i]=max{a[i],0} (i=1); //这里明显看出当i=1时,他的最大子段和不是他本身就是0;
dp[i]=max{dp[i-1]+a[i],0} (2<=i<=n) //递推的调用找到连续的最大子段和;

b.2最大二子段和
描述:给出一个序列,找出两个连续子段,且两个子段不重合,且找出的两个字段和为最大的两子段和;
我的思考
1.首先这也是一个求最值的问题,那么它可以用动态规划的方式进行求解;
2.由b中的求解最大子段和中,知道了如何找出最大子段和,既然这样的话是将这最大子段分为两个子段呢?还是怎样呢?不过因该是第一个为以a[i]结尾的子段,另外一个是从i之后的来找出第二个子段;因此可以知道a[i]结尾的子段的状态转移方程怎么求出,那第二个子段呢?怎么求解状态转移方程?
3.第一个子段的边界就是i=1时,由此可推,那么第二个的子段的边界就是i+1;
遇到问题:依然是状态转移方程方面,知道是如何分成两段的思想,却不知道如何完成用状态转移方程表达;
题解和我的思想
求解目标:
max{max{dp1[k]}+maxdp2[l]} ;//这是最终结果的得出,可以知道第一个子段时以k结尾的,第二个子段除去前k个数剩下的序列找出的最大子段和;
状态转移方程:
dp1[i]=max{a[i],0} (i=1)
dp1[i]=max{dp[i-1]+a[i],0} (2<=i<=n)
//和之前的求解最大子段和的方式相同;
dp2[j]=max{a[j],0}(j=n)
dp2[j]=max{dp2[j+1]+a[j],0}(1<=j<=n-1)
//第二个子段的求解方程式方法是由从子段的右端开始寻找;

最后这周感想:可能这周花在这个方面的时间还不够,导致现在对于找这个状态转移方程上面还存在一些问题,而且对于布置的题,求解数还远远不够,甚至有一些列题都还没有弄明白;并且动态规划在求解问题中非常的适用,所以之后应该用更多的时间来学习这部分知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值