acm pku 2479解题报告
2009-01-11 17:47
211 查看
这是一个动态规划的题目。可以使用双DP。输入的时候可以使用一次DP。求出最大值。然后从后往前进行一次DP求出最大值就可以了。时间复杂度为O(N)。
具体代码实现如下:#include<iostream>
using namespace std;
int temp[50000],num[50000];
const int MIN = -100000;
int main()
{
int test,n;
int tmp,ans,sum;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
tmp = MIN;
sum = 0;
for(int i=1;i<=n;i++)//第一次DP
{
scanf("%d",&num[i]);
sum += num[i];
if(sum>tmp)
tmp = sum;
temp[i] = tmp;
if(sum<0) sum = 0;
}
tmp = ans = MIN;
sum = 0;
for(int i=n;i>1;i--)//第二次DP
{
sum += num[i];
if(sum>tmp) tmp = sum;
if(ans<(temp[i-1]+tmp))
ans = temp[i-1]+tmp;
if(sum<0) sum = 0;
}
cout << ans << endl;
}
return 0;
}
具体代码实现如下:#include<iostream>
using namespace std;
int temp[50000],num[50000];
const int MIN = -100000;
int main()
{
int test,n;
int tmp,ans,sum;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
tmp = MIN;
sum = 0;
for(int i=1;i<=n;i++)//第一次DP
{
scanf("%d",&num[i]);
sum += num[i];
if(sum>tmp)
tmp = sum;
temp[i] = tmp;
if(sum<0) sum = 0;
}
tmp = ans = MIN;
sum = 0;
for(int i=n;i>1;i--)//第二次DP
{
sum += num[i];
if(sum>tmp) tmp = sum;
if(ans<(temp[i-1]+tmp))
ans = temp[i-1]+tmp;
if(sum<0) sum = 0;
}
cout << ans << endl;
}
return 0;
}
相关文章推荐
- 【DP】2479解题报告
- 2479 Maximum sum 解题报告
- acm pku 1128解题报告
- POJ - 2479 Maximum sum解题报告
- 解题报告2479
- ACM pku 1007 解题报告(给像我一样的新手们的忠告)
- ACM pku 1067 解题报告(威佐夫博奕(Wythoff Game))
- Sum - ACM PKU 1844 解题报告
- 【原】 POJ 2479 Maximum sum 动态规划 解题报告
- ACM pku 1005 解题报告
- ACM pku 1004 解题报告
- acm pku 1032 Parliament 解题报告
- POJ 2479 解题报告
- poj 2479解题报告
- acm pku 1321解题报告 棋盘问题
- acm pku 2418解题报告
- POJ 2479 Maximum sum 解题报告
- acm pku 1423解题报告
- poj 2593 & poj 2479解题报告
- ACM pku 1658 解题报告(另一种输入输出方式)