题目大意:给一个数字串,求这个数字串中两个不相交的子串和的最大值。
样例:
1
10
1 -1 2 2 3 -3 4 -4 5 -5
结果:13
{1,,-1,2,2,3,-3,4}和{5}
或
{2,2,3,-3,4}和{5}
这是一个简单dp问题,首先从前往后遍历求出以第i个数字结尾的子串和的最大值dp1[i],再从后往前遍历以第i个数字为开头的子串和的最大值dp2[i],所求结果就是从2到n遍历一遍i,dp1[i-1]+dp2[i]的最大值
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
#define maxn 50005
#define inf 1000000007
using namespace std;
int dp[maxn];
int num[maxn];
int t,n;
void DP()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)//正向求和
{
dp[i]=max(num[i],dp[i-1]+num[i]);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
DP();
int ans=-inf,b=0,sum=-inf;
for(int i=n;i>1;i--)
{
b=max(num[i],b+num[i]);
if(b>sum)
sum=b;
if(sum+dp[i-1]>ans)
ans=sum+dp[i-1];
}
printf("%d\n",ans);
}
return 0;
}