poj2479

Maximum sum
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 27486   Accepted: 8410

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.

Source

POJ Contest,Author:Mathematica@ZSU
 
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 

 5 using namespace std;

 6 

 7 int dp1[50010],dp2[50010];

 8 int a[50010];

 9 int n,t;

10 int maxD;

11 

12 int main()

13 {

14     scanf("%d",&t);

15     while(t--)

16     {

17         memset(dp1,0,sizeof(dp1));

18         memset(dp2,0,sizeof(dp2));

19         scanf("%d",&n);

20         for(int i=1; i<=n; i++)

21         {

22             scanf("%d",&a[i]);

23         }

24         //dp for 最大子序列和

25         dp1[0]=-10000000;

26         for(int i=1; i<=n; i++)

27         {

28             if(dp1[i-1]<0)

29                 dp1[i]=a[i];

30             else

31                 dp1[i]=dp1[i-1]+a[i];

32         }

33         for(int i=1; i<=n; i++)

34         {

35             if(dp1[i-1]>dp1[i])

36             {

37                 dp1[i]=dp1[i-1];

38             }

39         }

40 

41         //reverse dp

42         dp2[n+1]=-10000000;

43         for(int i=n; i>=1; i--)

44         {

45             if(dp2[i+1]<0)

46                 dp2[i]=a[i];

47             else

48                 dp2[i]=dp2[i+1]+a[i];

49         }

50         for(int i=n; i>=1; i--)

51         {

52             if(dp2[i+1]>dp2[i])

53                 dp2[i]=dp2[i+1];

54         }

55 

56         //cal

57         maxD=-10000000;

58         for(int i=1; i<=n-1; i++)

59         {

60             if(dp1[i]+dp2[i+1] > maxD)

61                 maxD=dp1[i]+dp2[i+1];

62         }

63 

64         printf("%d\n",maxD);

65     }

66     return 0;

67 }

 

你可能感兴趣的:(poj)