hdu1003Maxsum(最大子列和問題)
阿新 • • 發佈:2018-11-23
這道題開始一直是Time Limit Exceeded,後來改動了又Wrong Answer,然後就是Presentation Error,改著改著終於AC了
題目連結:hdu1003
這是一道動態規劃的題目,即求最大子序列和:給定一列數a[1],a[2].....a[n],求a[i]+...a[j](1<=i<=j<=n)連續序列最大
Sample Input
2 5 6 -1 5 4 -7
7 0 6 -1 1 -6 7
Sample Output
Case 1: 14 1 4
Case 2: 7 1 6
主要的思路就是以狀態maxdp[i]表示最大子列和,可以先令maxdp[0]=a[0],從第二項開始找,如果為正,則,tmpdp[i]=tmpdp[i-1]+a[i]
即狀態轉移方程:tmpdp[i] = tmpdp{a[i], tmpdp[i-1]+a[i]};
特別要注意的是這題的格式最後一個樣例沒有空行,要進行判斷,有些資料還要重新初始化
#include<stdio.h> #define MAX 100001 long tmpdp[MAX]; int a[MAX]; int main() { int j=1; int start,start1,end; long MAXdp;//當前最大和 int T;//輸入兩行 long i,m; scanf("%d",&T); while(T) { start=start1=end=0; MAXdp=0; scanf("%ld",&m);//一行中元素的個數 for(i=0;i<m;i++) { scanf("%d",&a[i]); tmpdp[i]=0; } MAXdp=a[0]; tmpdp[0]=a[0]; for(i=1;i<m;i++) { if(tmpdp[i-1]>= 0) { tmpdp[i] = tmpdp[i-1]+a[i]; } else小於0時,即把tmp[i-1]置為0 { tmpdp[i]= a[i]; start1=i; //記錄子列的起始位置 } if(tmpdp[i]>MAXdp)//更新子列最大和 { MAXdp=tmpdp[i]; start=start1;//更新初始位置 end=i;//更新末位置 } } printf("Case %d:\n",j); printf("%ld %d %d\n",MAXdp,start+1,end+1); if(T!=1) { printf("\n"); } j++; T--; } return 0; }
最大子列和問題主要是理解狀態轉移方程:tmpdp[i] = tmpdp{a[i], tmpdp[i-1]+a[i]};不斷地去更新最大子列的和就可以了。