dp[i]
求子数组的最大和,使用地推公式ans=max(ans,left[i-1]+right[i+1])
left[i]:标识从左到右i下标结尾的最大子数组和
right[i]:标识从右到左i下标结尾的最大子数和
int maxsum(vector<int>&arr)
{
int len = arr.size();
int ans = 0;
vector<int> left(len,0);
vector<int> right(len,0);
//初始化
left[0] = arr[0];
right[len-1] = arr[len-1];
//左边
ans = max(left[0],right[len-1];
for(int i=1;i<len;i++)
{
left[i] = arr[i]+max(0,left[i-1]);
ans = max(ans,left[i]);
}
//右边
for(int i = len-2;i>=0;--i)
{
right[i] = arr[i] + max(0,right[i+1]);
ans = max(ans,right[i]);
}
for(int i = 1;i<=len-2;i++)
{
ans = max(left[i-1]+right[i+1],ans);
}
return ans;