算法设计与分析——动态规划方法求解序列的连续最大子段和
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
(具体还是见代码吧)
源代码:
运行结果:
源代码改进:
做着做着 发现根本没必要单独定义一个结果数组
用一个变量temp代替数组ans[]
没错,又是算法课作业 (╯︵╰)
问题描述:
输入:整数序列 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(); }
相关文章推荐
- 算法设计与分析——动态规划方法求解序列的连续最大子段
- 数组的连续最大子段和
- 连续子数组最大和或最大子段和的求解算法及其正确性
- 最大子段连续积
- 连续子序列的最大乘积
- 最大子段-n个数求和最大且连续的子段-最简单的一维dp,动态规划入门教程,包听懂
- 最大子序列和问题的求解
- 求解最大子序列和
- 最大连续子段和
- 求一数字序列的最大子段和(三种解法)
- Max Sum 最大连续和的子序列 HDU 1003 (一维序列DP)
- 最大连续递增/递减/非递增/非递减子序列的长度(二分优化)
- 最大连续子序列求解
- POJ-2479 Maximum sum (不连续的最大子段和)
- 剑指offer 编程题(29):连续子序列和最大
- 最大公共子序列,最大子段和(动态规划)
- 最大子序列求解及分治算法的一些例子
- 最大子序列和的求解(时间复杂度O(N))
- hdu 1231 最大连续子序列(最大子段和)
- 动态规划求解数组连续最大和