POJ 2479 Maximum sum (双向DP)
Maximum sum
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 28485 | Accepted: 8713 |
Description
Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
Your task is to calculate d(A).
Input
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.
Output
Print exactly one line for each test case. The line should contain the integer d(A).
Sample Input
1 10 1 -1 2 2 3 -3 4 -4 5 -5
Sample Output
13
Hint
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.
Huge input,scanf is recommended.
Huge input,scanf is recommended.
Source
POJ Contest,Author:Mathematica@ZSU
双向DP求解:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=50010; int n,num[N]; int dpl[N],dpr[N]; int main(){ //freopen("input.txt","r",stdin); int t; scanf("%d",&t); while(t--){ scanf("%d",&n); scanf("%d",&num[0]); dpl[0]=num[0]; for(int i=1;i<n;i++){ scanf("%d",&num[i]); if(dpl[i-1]>=0) //从左向右求最大值 dpl[i]=dpl[i-1]+num[i]; else dpl[i]=num[i]; } int maxv=num[n-1],ans=-999999; dpr[n-1]=num[n-1]; for(int i=n-1;i>=1;i--){ if(dpr[i]>=0) //从右向左求最大值 dpr[i-1]=dpr[i]+num[i-1]; else dpr[i-1]=num[i-1]; if(maxv<dpr[i]) maxv=dpr[i]; if(ans<maxv+dpl[i-1]) ans=maxv+dpl[i-1]; } printf("%d\n",ans); } return 0; }