HDU 1003 解题报告
问题描述:求最大连续字串
分析:一道简单的DP,状态转移方程是d[i] = ( d[i-1]+a[i] > a[i] ) ? d[i-1]+a[i] : a[i]
d[i]表示以第i个数字结尾的连续字串的最大值,限制条件是 d[0]=0
题目要求找出最大连续字串的首尾序号,尾序号显然是d[i]的下标 i ,首序号用数组start[i]保存,point是保存首序号的临时量,注意point初值是1
还有一点,最后一组数据输出完换行后不能再打印空行,否则会判 Presentation Error
1 #include<cstdio> 2 3 int a[100005],start[100005],d[100005],T; 4 int main() 5 { 6 scanf("%d",&T); 7 int t=0; 8 while(++t<=T) 9 { 10 printf("Case %d:\n",t); 11 int n; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 scanf("%d",&a[i]); 15 int point=1; 16 d[0]=0; 17 for(int i=1;i<=n;i++) 18 { 19 if(d[i-1]+a[i]>a[i]) 20 { 21 d[i]=d[i-1]+a[i]; 22 start[i]=point; 23 } 24 else 25 { 26 d[i]=a[i]; 27 start[i]=point=i; 28 } 29 } 30 int max=d[1],ins=1; 31 for(int i=2;i<=n;i++) 32 { 33 if(d[i]>max) 34 { 35 max=d[i];ins=i; 36 } 37 } 38 printf("%d %d %d\n",max,start[ins],ins); 39 if(t<T) printf("\n"); 40 } 41 }