NEUOJ 1302: 最大子序列(双向dp)
来源:互联网 发布:windows系统安全策略 编辑:程序博客网 时间:2024/06/06 13:24
第一次写dp,有点小激动哈哈,纪念下
1302: 最大子序列
时间限制: 1 Sec 内存限制: 128 MB提交: 174 解决: 41
[提交][状态][讨论版]
题目描述
给定一个N个整数组成的序列,整数有正有负,找出两段不重叠的连续子序列,使得它们中整数的和最大。两段子序列都可以为空。
输入
多组输入,每组第一行为N,表示序列的长度;第二行为N个整数(-1000<=n<=1000),表示输入序列。
0<N<=1,000,000
输出
对于每组输入,输出一行,仅一个整数,表示最大的和。
样例输入
9185 -580 -889 701 964 -878 353 -761 608
样例输出
2273
提示
样例输入序列的一种选择为:(701 964)和(608)
来源
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define Max 1000002int num[Max];int dp1[Max],dp2[Max];int main(){ int n; freopen("input.txt","r",stdin); while( scanf("%d",&n)!=EOF) { memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",num+i); int &temp=num[i]; dp1[i]=dp1[i-1]; if(sum<0)sum=temp; else sum+=temp; if(dp1[i]<sum)dp1[i]=sum; } sum=0; for(int i=n;i>=1;i--) { int temp1=num[i]; dp2[i]=dp2[i+1]; if(sum<0)sum=temp1; else sum+=temp1; if(dp2[i]<sum)dp2[i]=sum; } int max=0; for(int i=1;i<=n;i++) { if(max<dp1[i]+dp2[i+1])max=dp1[i]+dp2[i+1]; } printf("%d\n",max); } return 0;}
0 0
- NEUOJ 1302: 最大子序列(双向dp)
- DP最大子序列
- 最大连续子序列+dp
- 最大连续子序列(DP)
- dp 最大递增子序列
- 【dp】最大连续子序列
- DP最大公共子序列
- ZOJ1074 最大和子矩阵 DP最大连续子序列
- HDU1231 最大连续子序列【最大子段和+DP】
- Hdu 最大连续子序列(DP)
- hdu 1003(最大子序列 DP)
- hdu 1231 最大连续子序列(DP)
- HDU 1231 最大连续子序列 (dp)
- hdu 1231最大连续子序列 【DP】
- 最大连续子序列 简单dp
- hdu 1231 最大连续子序列 (dp)
- HDU 1231 最大连续子序列(dp)
- 最大连续子序列 - HDU 1231 dp
- c++ 数据结构之STL之 map
- ZOJ Problem Set - 1858 Soundex
- POJ 1664 放苹果 解题报告
- 工欲善其事,必先利其器
- 文件传输(可以传输给多个客户)
- NEUOJ 1302: 最大子序列(双向dp)
- codeforces:A. The Great Game
- 第4周作业-打字成绩判断程序
- First Blog
- 【Kruskal 算法】
- UVALive 2957 Bring Them There(拆点+最大流)
- hdu2709(DP)
- 数据库之范式详解
- 探索推荐引擎内部的秘密(二)