代码

思路:f[i]为从0-n的子数组的最大累加和,同时设一个res,res = 数组中间到数组末尾没有选择的元素的总和
状态计算:f[i]由f[i-1]计算得来
其中:
1.当arr[i] + res < 0 时,f[i]= f[i-1],同时更新res
2.当arr[i] + res >= 0 时:
2.1.res + f[i-1] > 0,即f[i-1]+中间没有选择的元素和大于0,证明res + f[i-1] + arr[i] > arr[i],所以f[i] = f[i-1] + res + arr[i],同时将res=0
2.2.res + f[i-1] <= 0, 即res + f[i-1] + arr[i] <= arr[i], 所以:f[i] = arr[i],同时将res = 0

class Solution {
public:
    /**
     * max sum of the subarray
     * @param arr int整型vector the array
     * @return int整型
     */
    int f[100010];
    int maxsumofSubarray(vector<int>& arr) {
        f[0] = arr[0];
        int res = 0;// res初始为0
        for(int i = 1; i < arr.size(); i++) {
            if(arr[i] + res < 0) {
                f[i] = f[i-1];
                res += arr[i];
            }
            else {
                if ( res + f[i-1] > 0) {
                    f[i] = f[i-1] + res + arr[i];
                    res = 0;
                }   
                else {
                    f[i] = arr[i];
                    res = 0;
                }
            }
        }
//         for(int i = 1; i < arr.size(); i++) cout<<f[i] << endl;
        return f[arr.size()-1];
    } 
};