Problem : Maximum sum
Description:给你一个数组,让你求两个连续子序列,使两个子序列的和最大,这两个子序列不可重叠。
Solution:动态规划。用dp[i]来表示以第i个位置为终点的子序列的最大值,dpl[i]表示从0到第i个位置子序列的最大值,dpr[i]表示从m-1到第i个位置子序列的最大值。需要注意的是本题数据很大,要用cin输入会超时。
Code(C++):
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 50050
using namespace std;
int a[N];
int dp[N];
int dpl[N],dpr[N];
int ans[N];
int main()
{
int n,m,i;
cin>>n;
while(n--)
{
cin>>m;
int mm=-0x3f3f3f3f;
memset(dp,0,sizeof(dp));
memset(dpl,0,sizeof(dpl));
memset(dpr,0,sizeof(dpr));
for(i=0;i<m;i++)
//cin>>a[i];
scanf("%d",&a[i]);
dp[0]=a[0];dpl[0]=a[0];
for(i=1;i<m;i++)
dp[i]=max(dp[i-1]+a[i],a[i]);
for(i=1;i<m;i++)
dpl[i]=max(dpl[i-1],dp[i]);
memset(dp,0,sizeof(dp));
dp[m-1]=a[m-1];dpr[m-1]=a[m-1];
for(i=m-2;i>0;i--)
dp[i]=max(dp[i+1]+a[i],a[i]);
for(i=m-2;i>0;i--)
dpr[i]=max(dpr[i-1],dp[i]);
for(i=0;i<m-1;i++)
{
ans[i]=dpl[i]+dpr[i+1];
if(ans[i]>mm)
mm=ans[i];
}
cout<<mm<<endl;
}
return 0;
}