Maximum sum
Time Limit:1000MSMemory Limit:65536K
Total Submissions:34697Accepted:10752
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
1101 -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.
Source
,Author:Mathematica@ZSU
求两段的最大和,前后进行两次dp;
#include<stdio.h>#include<iostream>#include<math.h>#include<stdlib.h>#include<ctype.h>#include<algorithm>#include<vector>#include<string>#include<queue>#include<stack>#include<set>#include<map>using namespace std;int t, n, p[100010], ans[100010];int main(){scanf("%d",&t);while (t–){memset(ans,0,sizeof(ans));scanf("%d",&n);int b = 0, sum = -1000000000;for (int i = 0; i < n; i++){scanf("%d", &p[i]);b += p[i];sum = max(b, sum);ans[i] = sum;if (b < 0)b = 0;}b = 0, sum = -1000000000;int tmp = -1000000000;for (int i = n – 1; i >= 1; i–){b += p[i];sum = max(b, sum);tmp = max(tmp, ans[i – 1] + sum);if (b < 0)b = 0;}printf("%d\n",tmp);}return 0;}
,旅行是一种病。一旦感染了,你就再也无法摆脱。