题目:POJ 2593
题意:两个子串的和的最大值,两个子串可以相邻,但是不能重叠。
状态:
left[i]:表示左边前i个数的最大子段和;
right[i]:表示右边后i个数的最大子段和。
转移方程:
result = max(left[i]+right[i+1]); i 属于[0,n-1)
#include <iostream>
using namespace std;
int main()
{
int a[]={5,-3,10,12,-11,9};
int tmp,i,max;
int n=6;
int left[6],right[6];
//左边前i个数的最大子段和
tmp=a[0];
max=a[0];
left[0]=a[0];
for(i=1;i<n;i++)
{
if(tmp>0) tmp += a[i];
else tmp = a[i];
if(tmp>max)max=tmp;
left[i]=max;
}
//右边后i个数的最大子段和
tmp=a[n-1];
max=a[n-1];
right[n-1]=a[n-1];
for(i=n-2;i>=0;i--)
{
if(tmp>0) tmp += a[i];
else tmp = a[i];
if(tmp>max)max=tmp;
right[i]=max;
}
max=left[0]+right[1];
for(i=1;i<n-1;i++)
{
if(max<left[i]+right[i+1])
max=left[i]+right[i+1];
}
cout<<max<<endl;
return 0;
}