poj2479 c++ : Maximum sum
-
描述
- Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
t1 t2
d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n }
i=s1 j=s2
Your task is to calculate d(A). -
输入
- The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case. -
输出
- Print exactly one line for each test case. The line should contain the integer d(A).
-
样例输入
-
1
10
1 -1 2 2 3 -3 4 -4 5 -5
-
样例输出
-
13
题目大意:
给出一个数组,找到两段和最大,i<=j
解题思路:
动态规划DP问题,从前向后,从后向前遍历两遍,分别找到以i为结束和以i为开始的最大和,最后再遍历一遍找到两段的最大和,
#include<stdio.h>
#include<iostream>
#define max(A,B)((A)>=(B)?(A):(B))
using namespace std;
const int INF=100005;
int a[INF];
int lt[INF];
int rt[INF];
int dp1[INF];
int dp2[INF];
int main()
{
int i,j,c,n,sum;
scanf("%d",&c);
while(c--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
dp1[1]=a[1];
dp2[n]=a[n];
lt[1]=a[1];
rt[n]=a[n];
for(i=2;i<=n;i++)
{dp1[i]=max(dp1[i-1]+a[i],a[i]);
lt[i]=max(dp1[i],lt[i-1]);}
for(i=n-1;i>=1;i--)
{dp2[i]=max(dp2[i+1]+a[i],a[i]);
rt[i]=max(dp2[i],rt[i+1]);}
sum=-INF;
for(i=1;i<=n-1;i++){
sum=max(sum,lt[i]+rt[i+1]);
}
printf("%d\n",sum);
}
return 0;
}
|