软件工程 最大连续序列和

今天软件工程课的时候,老师举个例子,最大的连续子序列的问题,自己在在脑中,想起来了在ACM中做过的题,

简要说一下思路:动态规划,找到状态转移方程是关键。定义两个数组a[],b[],一个存自己输入的数组,一个用来存连续和的值。状态转移方程:b[i]=max{b[i-1]+a[i],a[i]},找出最大的b[i]。

伪代码:

for(循环)

if(a[i]>0),

b[i]=b[i-1]+a[i],

else

  b[i]=a[i]

我选择用的是选择排序,比较一轮就知道最大是哪一个,

max=b[0]

if(max<b[i])

   max=b[i]

输入测试数据组数:test;再输入:数组的大小;再输入:数组的各个元素。

输出: 最大连续序列和

源代码:

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 
 6 #define Max 1005
 7 int a[Max],b[Max];
 8 
 9 int main()
10 {
11     int i,n,test,max=0;
12     scanf("%d",&test);
13     while(test--)
14     {
15         scanf("%d",&n);
16         for(i=0;i<n;i++)
17              scanf("%d",&a[i]);
18         b[1]=a[1];
19         for(i=2;i<=n;i++)
20         {
21             if(a[i]>0)
22                 b[i]=b[i-1]+a[i];
23             else
24                 b[i]=a[i];
25         }
26         max=b[1];
27         for(i=2;i<=n;i++)
28         {
29              if(max<b[i])
30                 max=b[i];
31 
32         }
33         printf("%d",max);
34     }
35     return 0;
36 }

 

然后再找到最大连续序列和的同时,还需要输出从第几个数到第几个数的脚标。

题目在hdu oj:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid=2&problemid=1

就是输出变态一点,其实思路掌握了,就行。

我的代码:

 1 #include<iostream>
 2 #define N 100010
 3 using namespace std;
 4 int a[N],d[N];
 5 int main()
 6 {
 7     int test,n,i,max,k,f,e;
 8     cin>>test;
 9     k=1;
10     while(test--)
11     {
12         cin>>n;
13         for(i=1;i<=n;i++)
14             cin>>a[i];
15         d[1]=a[1];
16         for(i=2;i<=n;i++)
17         {
18             if(d[i-1]<0) d[i]=a[i];
19             else d[i]=d[i-1]+a[i];
20         }
21         max=d[1];e=1;
22         for(i=2;i<=n;i++)
23         {
24             if(max<d[i])
25             {
26                 max=d[i];e=i;
27             }
28         }
29         int t=0;
30         f=e;
31         for(i=e;i>0;i--)
32         {
33             t=t+a[i];
34             if(t==max)    f=i;
35         }
36         cout<<"Case "<<k++<<":"<<endl<<max<<" "<<f<<" "<<e<<endl;
37         if(test) cout<<endl;
38     }
39     return 0;
40 }

 

posted @ 2016-03-11 20:54  saucxs  阅读(303)  评论(0编辑  收藏  举报