软件工程 最大连续序列和

今天软件工程课的时候,老师举个例子,最大的连续子序列的问题,自己在在脑中,想起来了在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 @   saucxs  阅读(304)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示