poj 2479 Maximum sum 【DP】
2009-08-24 22:45
501 查看
题目:
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
Sample Output
Hint
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.
Huge input,scanf is recommended.
该题目很容易让人想到最大子段和,其实这只是一个变形,需要把结果存储起来。因为该题的数据量很大,时间复杂度
一定要控制在O(nlgn)以内。因为求最大子段和的时间复杂度只有O(n),如果将结果记录的话,那么解决这个问题的
时间复杂度就是O(2n)。
解决这个问题有两个关键:
1.从两边求取最大子段和
2.将结果存储
我们可以用两个数组left[M]和right[M]记录,left[i]表示a1……ai的最大子段和,right[i]表示ai……an的最大子段和。
然后求取MAX(left[i]+right[i+1])即可。
代码如下:
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.
该题目很容易让人想到最大子段和,其实这只是一个变形,需要把结果存储起来。因为该题的数据量很大,时间复杂度
一定要控制在O(nlgn)以内。因为求最大子段和的时间复杂度只有O(n),如果将结果记录的话,那么解决这个问题的
时间复杂度就是O(2n)。
解决这个问题有两个关键:
1.从两边求取最大子段和
2.将结果存储
我们可以用两个数组left[M]和right[M]记录,left[i]表示a1……ai的最大子段和,right[i]表示ai……an的最大子段和。
然后求取MAX(left[i]+right[i+1])即可。
代码如下:
#include<iostream> #include<cmath> using namespace std; #define M 50005 int LEFT[M],RIGHT[M]; void maxsumL(int *arr,int s,int f) { int sum=0; int st=s,end=s; int big=arr[s]; for(int i=s;i<=f;i++) { if(sum>0) sum+=arr[i]; else sum=arr[i]; if(sum>big) big=sum; LEFT[i]=big; } } void maxsumR( int *arr,int s,int f) { int sum=0; int st=s,end=s; int big=arr[f]; for(int i=f;i>=s;i--) { if(sum>0) sum+=arr[i]; else sum=arr[i]; if(sum>big) big=sum; RIGHT[i]=big; } } int main() { int ca; scanf("%d",&ca); int arr[M]; while(ca--) { int num; scanf("%d",&num); int i; for(i=1;i<=num;i++) scanf("%d",&arr[i]); maxsumL(arr,1,num); maxsumR(arr,1,num); int maxi=INT_MIN; LEFT; RIGHT; for(i=1;i<num;i++) { if(maxi<LEFT[i]+RIGHT[i+1]) maxi=LEFT[i]+RIGHT[i+1]; } printf("%d/n",maxi); } return 0; }[/code]
相关文章推荐
- POJ 1050 To the Max && POJ 2479 Maximum sum(DP最大连续子段和)
- POJ2479 Maximum sum 最长连续子序列[DP]
- POJ 2479 Maximum Sum (DP)
- POJ——2479 Maximum sum(dp)
- poj 2479 Maximum sum(DP)
- POJ2479 Maximum sum(dp)
- POJ 2479 Maximum sum (DP)
- POJ 2479 Maximum sum(双向DP)
- POJ 2479 Maximum sum[DP]
- POJ 2479 - Maximum sum(线性DP)
- poj2479——Maximum sum(dp)
- POJ 2479 Maximum sum (DP&双最大子段和)
- POJ 2479-Maximum sum(线性dp)
- POJ - 2479 《Maximum sum》 【线性DP】
- poj 2479 Maximum sum(简单dp,最大连续和拓展)
- POJ-2479-Maximum sum-双向dp-2次连续区间和
- POJ 2479 Maximum sum(DP)
- POJ 2479-Maximum sum(线性dp)
- POJ2479 Maximum sum 最长连续子序列[DP]
- POJ 2479 (后附 POJ 2593) DP