最大子序列和问题(动态规划)
来源:互联网 发布:怎么样在淘宝网上开店 编辑:程序博客网 时间:2024/05/18 01:43
最大子序列和问题(动态规划)
1.问题详解
输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和。例如:
序列:-2 11 -4 13 -5 -2,则最大子序列和为20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。
2.解决办法
这一类题目我们通常采用动态规划来解决,即可以通过一次遍历完成对于最大子序列以及相应位置坐标的求解。
思路如下(假设存在正数):
(1)我们需要理解,如果一个数是负数,那么它不可能是起点,任何负数序列不可能为最大子序列和的序列。
(2)我们从第一个元素往后遍历,所记录元素的数组为a[],对于这些输入的数组元素,我们设一个和thisSum,初始化为0。对应这个thisSum,我们设置一个记录最大数值
和的元素maxSum,每次输入一个数组元素,如果thisSum比maxSum大,则进行更新。
(3)如果thisSum<0,那么前面这一段的最大值已经记录完毕,存在maxSum里面,造成thisSum<0的原因是该元素<0,因此,在后面的元素的遍历中,不能继续使用该
元素,因此,将thisSum置为0,继续从该元素的下一个元素为起点进行遍历。
注意:很多同学可能不能理解,为什么如果是中间一块儿最大,还要从头开始遍历呢。我们可以想想,如果中间最大,那么左右两边肯定不管扩大,两边的和都是负数。因此,当从头到尾遍历时,若thisSum<0了,那么则不继续计入计算。
3.代码(不要求记录位置)
int max(const vector<int>& a) { int maxSum = 0, thisSum = 0; for (int j = 0; j < a.size(); j++) { thisSum += a[j]; if (thisSum > maxSum) maxSum = thisSum; else if (thisSum < 0) thisSum = 0; } return maxSum; }4.代码(要求输出位置)
#include <iostream>#include <cstdio>using namespace std;int a[10005];int main(){ int n; while(scanf("%d",&n)!=EOF) { int maxSum=0,thisSum=0,s=0,e=0,star=0,en=n-1;//初始化,起点终点游动坐标为s,e;记录坐标为star、en for(int i=0; i<n; i++) { scanf("%d",&a[i]); if(thisSum>=0)//终点右移,thisSum更新 { e=i; thisSum+=a[i]; } else//thisSum<0(这里的thisSum没有加上a[i]),更新此时的起点终点到下一个坐标位 { s=i; e=i; thisSum=a[i]; } if(thisSum>maxSum|| (thisSum==0&&en==n-1))//当取得thisSum的值大于maxSum时,进行更新,记录坐标 { star=s; en=e; maxSum=thisSum; } } printf("%d %d %d\n",maxSum,a[star],a[en]); } return 0;}
- 最大子序列和问题(动态规划)
- 动态规划_最大子序列和问题以及最大子序列问题
- 算法/动态规划/MaxSum最大子序列和问题
- 和最大子序列---动态规划
- [动态规划]最大连续子序列和
- 动态规划之最大子序列和
- 最大连续子序列和-动态规划
- 最大连续子序列和----动态规划
- 动态规划--最大上升子序列和
- 动态规划:最大上升子序列和
- 动态规划? 最大连续子序列和
- 动态规划:最大连续子序列和
- 最大连续子序列和-动态规划
- 动态规划--最大和子序列
- 动态规划最大子序列和(九度1077)
- 【动态规划(最大子序列和)】:poj2479,Maximum sum
- HDU1003 Max Sum(动态规划,最大子序列和)
- 动态规划练习题-13(最大上升子序列和)
- android如何制作出一个简单的聊天app
- el表达式的一个小问题
- Echarts:折现图表案例
- IOS 下载文件断点续传原理与实现(附源码)
- java入门教程-1.8Java类库及其组织结构(Java API)
- 最大子序列和问题(动态规划)
- 让sql server 数据库的表id从1开始
- android中的内部类
- JAVA异常处理。
- pip的常用操作
- docker的一些命令
- Oracle删除当前用户下所有的表的方法
- 后台定位AppStore被拒-iOS最新苹果审核要求
- 强悍的 Linux —— 强悍的 grep