目录
子数组是必须要求连续的,子序列可以是不连续的。
问题一:这种“连续”相关的问题以什么作为动态规划集合的划分的呢?
答:以i结尾的连续子数组的集合。注意,必须以i为结尾。
问题二:状态是怎么进行计算的呢?
答:第i个元素在决策的时候有两种选择,一种是选择与原本的以i-1结尾的最优子数组连接上另一种是单独自身新变成一个子数组。
- class Solution {
- public:
- int FindGreatestSumOfSubArray(vector<int> array) {
- vector<int> dp(array.size(),0);
- dp[0]=array[0];
- int maxx=dp[0];//维护最大值
- for(int i=1;i
size();i++) - {
- dp[i]=max(dp[i-1]+array[i],array[i]);
- maxx=max(maxx,dp[i]);
- }
- return maxx;
- }
- };
我们注意到方法一的动态规划在状态转移的时候只用到了dp[i−1]的信息,没有使用整个辅助数组的信息,因此可以用last变量滚动存储dp[i-1]的信息将数组优化掉。(类比于滚动数组)这里我们可以叫它滚动变量。
- class Solution {
- public:
- int FindGreatestSumOfSubArray(vector<int> array) {
- int maxx=-0x3f3f3f3f;
- for(int i=0,last=0;i
size();i++) - {
- last=max(array[i],array[i]+last);
- maxx=max(maxx,last);
- }
- return maxx;
- }
- };