您的位置:首页 > 其它

算法设计与分析——动态规划方法求解序列的连续最大子段和

2017-11-09 00:20 435 查看
当 当 当 当 ~~

没错,又是算法课作业 (╯︵╰)

问题描述:

输入:整数序列 a1, a2 … an

输出:序列的一个连续子段,使该子段和最大,输出最大子段和

当所有整数都为负数时,定义最大子段和为0

语言:c++

若要输出连续子段,见链接(眼神不好,交作业才读懂题):

http://blog.csdn.net/sunshine__0411/article/details/78484960

关于动态规划:

首先确定的是使用动态规划的思想编写算法,动态规划是一个多阶段决策问题。假设事件在初始状态后需要经过n个这样的阶段。从i阶段发展到i+1阶段可能有多种不同的途径,而事件必须从中选择一条途径往前进展。在两个阶段间的选择发展途径的行为称为一次“决策”。事件的发展过程之中需要做n次决策,这些决策就构成了事件整个发展过程的一个决策序列——这一过程称为多阶段决策过程。

划重点:对任意的i,阶段i以后的行为仅依赖于i阶段的状态,而与i阶段之前,过程如何达到这种状态的方式无关。

思路分析:

int n; int a
//存储待计算序列an

想办法把an这个序列串起来,每个状态仅依赖于之前的状态。

定义一个int max //保存最大值

定义一个答案数组ans
(其实后来发现可以不用这个数组,都是后话。后话。。。)

ans[i]=max{ans[i-1]+a[i],a[i]}

如果ans[i-1]+a[i]>max =>更新最大值

如果ans[i-1]+a[i]<0 =>ans[i]=0

(具体还是见代码吧)

源代码:

#include <iostream>
using namespace std;

int max_sum(int n,int a
){
int ans[100] = {0}; //答案数组
int max=0;
if(a[0]>0){
ans[0]=a[0];
max=a[0];
}
for(int i=1;i<n;i++){
ans[i]=ans[i-1]+a[i];
if(ans[i]>max){
max=ans[i];
}
if(ans[i]<0){
ans[i]=0;
}
}
/*for(int i=0;i<n;i++){
cout<<ans[i];
}*/
return max;
}

int main() {
int n; //序列长度n
int a[100]; //输入的整数序列
cin>>n;
for (int i=0; i<n; i++){ //输入待计算的n个数字
cin>>a[i];
}
cout<<"最大子序列和为:"<<max_sum(n,a)<<endl;//调用max_sum函数,并且输出最大子序列和
//cout<<max_sum();
}


运行结果:





源代码改进:

做着做着 发现根本没必要单独定义一个结果数组

用一个变量temp代替数组ans[]

#include <iostream>
using namespace std;

int max_sum(int n,int a
){
//int ans[100] = {0}; //答案数组
int temp=0;
int max=0;

for(int i=0;i<n;i++){
temp=temp+a[i];
if(temp>max){
max=temp;
}
if(temp<0){
temp=0;
}
}
/*for(int i=0;i<n;i++){
cout<<ans[i];
}*/
return max;
}

int main() {
int n; //序列长度n
int a[100]; //输入的整数序列
cin>>n;
for (int i=0; i<n; i++){ //输入待计算的n个数字
cin>>a[i];
}
cout<<"最大子序列和为:"<<max_sum(n,a)<<endl;//调用max_sum函数,并且输出最大子序列和
//cout<<max_sum();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 设计 动态规划