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 0Huge input, scanf is recommended.HintHint
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231
题目大意:求最大连续子序列,并求出其首位元素
解题思路:利用动态规划,在第i次循环时候dp[i]存储从第1个元素到第i个元素位中,
含有第i个元素的子序列的最大值。
#include"iostream" #include"cstdio" #include"algorithm" using namespace std; int a[10005]; int dp[10005]; int st[10005];//记录各个dp[i]的最开始的数 int main() { int n; while(scanf("%d",&n)!=EOF){ if(n==0) break; int flag=1; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]>=0) flag=0; } if(flag){ printf("0 %d %d\n",a[1],a[n]); continue; } for(int i=0;i<=n;i++){ dp[i]=0; } int s=1,e=1; int _max=-110000000; for(int i=1;i<=n;i++){ if(dp[i-1]>0){ dp[i]=dp[i-1]+a[i]; st[i]=st[i-1]; } else{ dp[i]=a[i]; st[i]=i; } if(dp[i]>_max){ _max=dp[i]; e=i; s=st[i]; } } printf("%d %d %d\n",_max,a[s],a[e]); } return 0; }