题意:最大连续子序列问题+输出答案所在的区间
题解:最大连续子序列问题状态转移方程:f[i]=max(a[i],f[i-1]+a[i])
答案所在区间的话可以在递推求状态的时候,顺便记录一下当前位置所在的序列左端点是谁,最后扫描的时候记录下最优解的位置,然后这个位置就是右端点,记录过的数据就是左端点。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int a[10001]; 7 int f[10001]; 8 int res[10001]; 9 int main() 10 { 11 while(true) 12 { 13 bool check=false; 14 int n; 15 scanf("%d",&n); 16 if(n==0) 17 { 18 break; 19 } 20 memset(f,0,sizeof(f)); 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d",&a[i]); 24 if(a[i]>=0) 25 { 26 check=true; 27 } 28 res[i]=i; 29 } 30 if(!check) 31 { 32 printf("0 %d %d\n",a[1],a[n]); 33 continue; 34 } 35 f[1]=a[1]; 36 for(int i=2;i<=n;i++) 37 { 38 //f[i]=max(a[i],f[i-1]+a[i]); 39 if(a[i]>f[i-1]+a[i]) 40 { 41 f[i]=a[i]; 42 res[i]=i; 43 } 44 else 45 { 46 f[i]=f[i-1]+a[i]; 47 res[i]=res[i-1]; 48 } 49 } 50 int ans=0; 51 int tip=0; 52 for(int i=1;i<=n;i++) 53 { 54 if(ans<f[i]) 55 { 56 ans=f[i]; 57 tip=i; 58 } 59 } 60 printf("%d %d %d\n",ans,a[res[tip]],a[tip]); 61 } 62 return 0; 63 }