题意:最大连续子序列问题+输出答案所在的区间
题解:最大连续子序列问题状态转移方程: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 }