动态规划

  • dp[i]保存连续和,理解dp[i]=max(dp[i-1]+array[i],array[i])
  • 如果dp[i-1]+array[i]<array[i],原来的起点到array[i]之间连续和使得array[i]更小,从array[i]作为起点会更大
  • 当dp[i]=array[i]时,更新起点,从array[i]开始计算。
  • 更本质地来说从找出最大和的起点,dp[i]保存的从某个起点开始的连续和。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        int dp[array.size()];
        dp[0]=array[0];
        int max_val=dp[0];
        for(int i=1;i<array.size();i++)
        {
            dp[i]=max(array[i],dp[i-1]+array[i]);
            if(max_val<dp[i])
            {
                max_val=dp[i];
            }
        }
        return max_val;
    }
};

动态规划优化

  • 不需要回溯变量因此只用一个变量保存值,另外一个变量记录最大值
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        int sum=array[0];
        int max_val=sum;
        for(int i=1;i<array.size();i++)
        {
            sum=max(array[i],sum+array[i]);
            max_val=max(sum,max_val);
        }
        return max_val;
    }
};