poj2479 Maximum sum(动态规划)
2016-10-09 23:57
417 查看
题意:在一个序列中寻找两个连续子序列,并且他们的和最大。
思路:定义两个数组。第一个数组从前往后记录前i(1-i)个元素中最大连续子序列,第二个数组从后往前记录前i(i-n)个元素中最大子序列和。
代码如下:
思路:定义两个数组。第一个数组从前往后记录前i(1-i)个元素中最大连续子序列,第二个数组从后往前记录前i(i-n)个元素中最大子序列和。
代码如下:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #define MAX 0x3f3f3f3f using namespace std; int num[50005],dp[50005],dp1[50005]; int main() { int t,n,max1; scanf("%d",&t); while(t--) { max1=-MAX; memset(num,0,sizeof(num)); memset(dp,0,sizeof(dp)); memset(dp1,0,sizeof(dp1)); scanf("%d",&n); for(int i=1;i<=n;i++) { num[i]=-10005; } for(int i=1;i<=n;i++) { scanf("%d",&num[i]); } dp[1]=num[1]; for(int i=2;i<=n;i++) { dp[i]=max(num[i],dp[i-1]+num[i]); } for(int i=2;i<=n;i++) { dp[i]=max(dp[i],dp[i-1]); } dp1 =num ; for(int i=n-1;i>=1;i--) { dp1[i]=max(num[i],dp1[i+1]+num[i]); } for(int i=n-1;i>=1;i--) { dp1[i]=max(dp1[i],dp1[i+1]); } for(int i=1;i<=n-1;i++) { max1=max(max1,dp[i]+dp1[i+1]); } printf("%d\n",max1); } return 0; }
相关文章推荐
- POJ 2479 动态规划 最大子序列问题(两段) Maximum sum
- 【原】 POJ 2479 Maximum sum 动态规划 解题报告
- POJ 2479 Maximum sum 动态规划 解题报告
- POJ 2479 Maximum sum (动态规划)
- 【动态规划(最大子序列和)】:poj2479,Maximum sum
- POJ 2479 Maximum sum 动态规划 最大子段和 最大子段积
- POJ 2479 - Maximum sum(线性DP)
- POJ 2479 Maximum sum(2007-04-25 23:33)
- POJ 2479 Maximum sum(动态规划、多段最大子序列求和)
- POJ 2479 Maximum sum(两段连续和最大)
- POJ 2479 Maximum sum (DP)
- poj 2479 Maximum sum
- POJ 2479 Maximum sum(2次最大字段和)
- 【poj 2479】Maximum sum 题意&题解&代码(C++)
- POJ 2479 Maximum sum
- poj 2479 Maximum sum 最大数字连续和
- poj 2479 Maximum sum (最大字段和的变形)
- poj 2479 Maximum sum(简单dp,最大连续和拓展)
- POJ-2479 Maximum sum (不连续的最大子段和)