POJ 2479 - Maximum sum(线性DP)
2014-10-10 21:58
357 查看
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.
题意:
求出得到两段子序列 和最大。
思路;
l[i] 记录从0到i 最大的子序列的和,r[i] 记录从i 到n-1的子序列最大和。
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
const int inf=0xfffffff;
typedef long long ll;
using namespace std;
int num[50005];
int l[50005], r[50005];
int main()
{
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &num[i]);
}
l[0] = num[0];
for(int i = 1; i < n; ++i){
if(l[i - 1] < 0){
l[i] = num[i];
}
else l[i] = l[i - 1] + num[i];
}
for(int i = 1; i < n; i++){
l[i] = max(l[i], l[i - 1]);
}
r[n - 1] = num[n - 1];
for(int i = n - 2; i >= 0; --i){
if(r[i + 1] < 0){
r[i] = num[i];
}
else r[i] = r[i + 1] + num[i];
}
for(int i = n - 2; i >= 0; --i){
r[i] = max(r[i], r[i + 1]);
}
int ans = -inf;
for(int i = 1; i < n; ++i){
ans = max(ans, l[i - 1] + r[i]);
}
printf("%d\n", ans);
}
return 0;
}
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.
题意:
求出得到两段子序列 和最大。
思路;
l[i] 记录从0到i 最大的子序列的和,r[i] 记录从i 到n-1的子序列最大和。
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
const int inf=0xfffffff;
typedef long long ll;
using namespace std;
int num[50005];
int l[50005], r[50005];
int main()
{
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &num[i]);
}
l[0] = num[0];
for(int i = 1; i < n; ++i){
if(l[i - 1] < 0){
l[i] = num[i];
}
else l[i] = l[i - 1] + num[i];
}
for(int i = 1; i < n; i++){
l[i] = max(l[i], l[i - 1]);
}
r[n - 1] = num[n - 1];
for(int i = n - 2; i >= 0; --i){
if(r[i + 1] < 0){
r[i] = num[i];
}
else r[i] = r[i + 1] + num[i];
}
for(int i = n - 2; i >= 0; --i){
r[i] = max(r[i], r[i + 1]);
}
int ans = -inf;
for(int i = 1; i < n; ++i){
ans = max(ans, l[i - 1] + r[i]);
}
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- 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 1050 To the Max && POJ 2479 Maximum sum(DP最大连续子段和)
- POJ 2479 Maximum sum(双向DP)
- POJ-2479-Maximum sum-双向dp-2次连续区间和
- POJ2479 Maximum sum 最长连续子序列[DP]
- POJ2479 Maximum sum 最长连续子序列[DP]
- POJ 2479 初步线性 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)
- POJ2479【线性DP】
- POJ——2479 Maximum sum(dp)
- poj 2479 Maximum sum(简单dp,最大连续和拓展)