目录
题目
前置知识
什么是子数组,和子序列有什么区别?
子数组是必须要求连续的,子序列可以是不连续的。
方法一:动态规划(使用数组)
分析
问题一:这种“连续”相关的问题以什么作为动态规划集合的划分的呢?
答:以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<array.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<array.size();i++) { last=max(array[i],array[i]+last); maxx=max(maxx,last); } return maxx; } };