6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0HintHint
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define N 10005 int dp[N],a[N]; int main() { int i,n; while(scanf("%d",&n),n) { int flag=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]>=0) flag=1; } if(flag==0) //a数组都为负数 { printf("0 %d %d\n",a[1],a[n]); continue; } dp[1]=a[1]; for(i=2;i<=n;i++) { if(dp[i-1]<0) //自己理解一下吧 dp[i]=a[i]; else dp[i]=dp[i-1]+a[i]; } int pos=1; for(i=2;i<=n;i++) if(dp[i]>dp[pos]) //注意是 > ,题目找最小的终点 pos=i; //找出最大dp位置 int s,temp=0; for(i=pos;i>=1;i--) { temp+=a[i]; if(temp==dp[pos]) //注意,不是break,因为题目说最小的起点 s=i; } printf("%d %d %d\n",dp[pos],a[s],a[pos]); } return 0; }
HDU 1231 最大连续子序列,布布扣,bubuko.com
原文:http://blog.csdn.net/u014737310/article/details/38356203