终于A了。POJ2479
题目就是求两断连续子序列的和的最大值
因为是两端,求的时候就可以设置一个分割点,分别求两端的最大值之和,求两端的最大值之和的时候用DP就好了
dp1[i]表示从0到i的最大值
dp2[i]表示从n-1到i的最大值
代码如下
/*************************************************************************
> File Name: poj2479.cpp
> Author: ThunderSei
> Mail: z3635363@163.com
> Created Time: 2013年09月26日 星期四 13时19分31秒
************************************************************************/
#include<iostream>
#include<string>
#include<memory.h>
#include<stdio.h>
//short dp[10002][10002];
int num[50002];
int max0[50002];
int maxn[50002];
int dp1[50000];
int dp2[50000];
using namespace std;
int main()
{
int t;
int n;
int i,j,k;
int max;
int nowmax;
cin>>t;
while(t--)
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
max=-99999;
nowmax=0;
// memset();
cin>>n;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
// memset(dp,0,sizeof(dp));
max=-99999;
nowmax=0;
for(j=0;j<n;j++)
{
if(nowmax>0)
nowmax+=num[j];
else
nowmax=num[j];
if(nowmax>max)
max=nowmax;
dp1[j]=max;
} // dp[i][j]=max;
max=-99999;
nowmax=0;
for(j=n-1;j>=0;j--)
{
if(nowmax>0)
nowmax+=num[j];
else
nowmax=num[j];
if(nowmax>max)
max=nowmax;
dp2[j]=max;
} // dp[i][j]=max;
for(i=0;i<n;i++)
{
// cout<<dp1[i]<<" ";
}
//cout<<endl;
for(i=0;i<n;i++)
{
// cout<<dp2[i]<<" ";
}
//cout<<endl;
max=dp1[0]+dp2[1];
for(i=0;i<n-1;i++)
{
if(max<dp1[i]+dp2[i+1])
max=dp1[i]+dp2[i+1];
}
cout<<max<<endl;
}
}