poj2479_简单动态规划
2010-05-30 02:47
363 查看
题意:给定一个序列,在这个序列中任取不相交的两段,使得和最大,求最大和
解法:对于每个位置i,保留从开头到该位置能找到最大连续段的和,方法为从前往后扫,保留最大段tmp,和一个能加到位置i的最大数sum,如果sum+A[i]>tmp,则tmp=sum+A[i];如果sum<0则令sum=0,不作贡献;然后从后往前做一遍,做的过程中对于位置i,找出它前面能找到的最大段和它后面能找到的最大段的和最大,代码如下:
解法:对于每个位置i,保留从开头到该位置能找到最大连续段的和,方法为从前往后扫,保留最大段tmp,和一个能加到位置i的最大数sum,如果sum+A[i]>tmp,则tmp=sum+A[i];如果sum<0则令sum=0,不作贡献;然后从后往前做一遍,做的过程中对于位置i,找出它前面能找到的最大段和它后面能找到的最大段的和最大,代码如下:
#include <iostream> using namespace std; int A[50005]; int matrix[50005]; int main() { int t,n,i; int sum; scanf("%d",&t); while (t--) { int tmp=-100000; sum=0; scanf("%d",&n); for (i=0;i<n;i++) { scanf("%d",&A[i]); sum+=A[i]; if (sum>tmp) { tmp=sum; } if (sum<0) { sum=0; } matrix[i]=tmp; } int ans=-1000000; sum=0; tmp=-1000000; for (i=n-1;i>=1;i--) { sum+=A[i]; if (sum>tmp) { tmp=sum; } if (sum<0) { sum=0; } if (matrix[i-1]+tmp>ans) { ans=matrix[i-1]+tmp; } } printf("%d/n",ans); } return 0; }
相关文章推荐
- 简单动态规划——三逆数的O(N^2)解法!
- LeetCode 198 House Robber(简单的动态规划)
- 简单动态规划——电路布线
- 一个简单的动态规划问题
- 简单动态规划
- POJ 1458简单的动态规划:求最长子序列
- ACM: 简单 动态规划题 toj 1509 (…
- 动态规划之简单递推(HDU2041,HDU2044,HDU2045,HDU2046,HDU2047)
- 简单动态规划问题分析
- HDU 2041 超级楼梯 简单DP动态规划 递归
- 【练习09】简单动态规划 1006 数塔
- 【练习09】简单动态规划 1003 Super Jumping! Jumping! Jumping!
- HDU 1158(简单的动态规划)
- 【算法】简单动态规划——三逆数的O(N^2)解法!
- 杭电1159 简单的动态规划 图解
- HDU 1520 浅谈简单树形动态规划
- hdu 2018 母牛的故事 动态规划--简单
- 简单动态规划 climbing-stairs
- 第十周 简单的动态规划
- 数塔 2084 (简单的动态规划)