又谈最大连续子序列 hoj-1003
2013-07-11 15:59
190 查看
上面谈到用DP做最大连续子序列,后来又看到另一种方法:
网上说是一个专家提出,确实挺简单的,具体证明就不给出了,大家有兴趣的可以网上找找。
如果实在不理解就先敲几遍记住吧。。。。。
题意:也是给出一列数,求其中最大的连续序列和,和首尾排位数;
输入:第一行是测试例子数,然后跟N行例子。输出:两行,第一行是Case %d: 第二行依次是 最大和,首尾排位数,末尾排位数。
例子:
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Case 1:
14 1 4
Case 2:
7 1 6
现给出AC代码:
用DP过的代码:
网上说是一个专家提出,确实挺简单的,具体证明就不给出了,大家有兴趣的可以网上找找。
如果实在不理解就先敲几遍记住吧。。。。。
题意:也是给出一列数,求其中最大的连续序列和,和首尾排位数;
输入:第一行是测试例子数,然后跟N行例子。输出:两行,第一行是Case %d: 第二行依次是 最大和,首尾排位数,末尾排位数。
例子:
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Case 1:
14 1 4
Case 2:
7 1 6
现给出AC代码:
#include<stdio.h> int main() { int T,t,n,time,sum,maxs,i,a; int st,ed; scanf("%d",&t); T=t; while(t--) { time=1;sum=0;maxs=-1001; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a); sum+=a; if(sum>maxs) { maxs=sum; st=time; ed=i; } if(sum<0) { sum=0; time=i+1; } } printf("Case %d:\n%d %d %d\n",T-t,maxs,st,ed); if(t)printf("\n"); } return 0; }
用DP过的代码:
#include<stdio.h> int main() { int a[100010],sum[100010],maxn; int N,n,m,i,st,ed; scanf("%d",&n); N=n; while(n--) { scanf("%d",&m); for(i=1;i<=m;i++) scanf("%d",&a[i]); sum[0]=0; for(i=1;i<=m;i++) { if(sum[i-1]>=0) sum[i]=sum[i-1]+a[i];//状态转移方程; else sum[i]=a[i]; } maxn=-1001; for(i=1;i<=m;i++) if(sum[i]>maxn) maxn=sum[i],ed=i; st=ed; for(i=ed-1;i>=1;i--) if(sum[i]>=0) st=i; else break; printf("Case %d:\n%d %d %d\n",N-n,maxn,st,ed); if(n)printf("\n"); } return 0; }
相关文章推荐
- HDU 1003 Max Sum(dp,最大连续子序列和)
- HDU 1003 Max Sum (入门DP[1] 最大连续子序列)
- hdu杭电1003 dp 连续子序列最大值
- hdu 1231 最大连续子序列 ,1003 Max Sum;
- 1003 最大连续子序列
- hdoj_1231&&hdoj_1003最大连续子序列
- hdu 1003/poj 1050 连续子序列最大和经典基础dp
- hdu 1003 Max Sum(最大连续子序列和) (学了一下分治)
- 六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)
- hdoj_1231&&hdoj_1003最大连续子序列
- HDU-1003-Max Sum(dp经典问题-最大连续子序列和)
- HDU 1003 Max Sum 最大连续子序列和
- HDU 1003 Max Sum【最大连续子序列的和】
- hdu 1003 MAX SUM(最大连续子序列和)
- ACM—最大连续子序列(HDOJ1003)
- hdu-1003-动态规划-求连续子序列最大和问题
- hdu 1003 Max Sum (最大连续子序列)
- hdu 1003 Max Sum (最大连续子序列)
- HDU 1231 最大连续子序列(HDU 1003 dp)
- HDU - 1003 Max Sum(连续子序列最大和)