PTA甲级刷题记录——动态规划专题
PTA甲级刷题记录——动态规划题解,方便自己复盘
A1007 Maximum Subsequence Sum (25分)(最大连续子序列和)
题目大意:
给定一个数字序列a1,a2…an,求i,j,使得ai+…+aj最大,输出最大和以及
ai,aj.
最大连续子序列和:
(1)令状态dp[i]表示以A[i]作为末尾的连续序列的最大和(A[i]必须作为连续序列的末尾)
通过设置dp数组,要求的最大和其实是dp[0],dp[1]…dp[n-1]中的最大值
(2)dp[i]必须是以A[i]作为末尾连续序列,只有两种情况
- 这个最大的连续序列只有一个元素,即以A[i]开始A[i]结束
- 这个最大和的连续序列有多个元素,即从前面某处A[p]开始,一直到A[i]结尾。
对于第一种情况,最大和就是A[i]本身
对于第二种情况,最大和是dp[i-1] +A[i]
则转台转移方程是dp[i] = max{A[i],dp[i-1] +A[i]};
以s[i]表示以A[i]作为结尾的最大连续子序列是从那个元素开始的(记录下标),根据上面的策略:
- 第一种情况,只有一个元素,这个最大的连续子序列就是从A[i],开始,于是s[i] = i;
- 第二种情况,注意到dp[i]和dp[i-1]使用的是同一个其实元素p,因此s[i]=s[i-1]
最后只需要得到dp[0]…dp[n-1]最大值的过程中记录最大值的下标k,然后输出dp[k]],A[s[k]],A[k]即可
// |