DP–最大子段和问题(动态规划)

问题:
有n个整数组成一个a1,a2,a3,… ,an序列。求其子段和的最大值(子段是连续的)

比如{-2,11,-4,13,-5,-2},最大子段和就是11-4+13=20

解题思路:
这是一个很典型的动态规划性质的题目,我们先设置一个dp数组

dp[i]表示以a[i]为结尾的子段的最大子段和。这里注意一定要以a[i]结尾而不是a[1]到a[i]间任意子段,因为这样有利于利用与维护其最优子结构性质

得到递推式:

(1.)dp[i]=dp[i-1]+a[i]-------当dp[i-1]>0时,
(2.)dp[i]=a[i]-----------------当dp[i-1]<=0时。

具体的看源码吧–>
参考代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int a[110];
int MaxSum_list(int n, int a[110]) {//求出一维数组(a[])的最大子段值int Max = -inf;//注意这里要用-inf初始化,否则遇到全负的情况则会出现最大值为0的情况//除非规定全负时最大子段值就是0int dp = 0;for (int i = 1; i <= n; i++) {dp = max(dp + a[i], a[i]);//如果dp[i-1]<0,则dp[i]=a[i];否则dp[i]=dp[i-1]+a[i]//由于我们只需要知道最大值,所以不需要开dp数组,直接用Max维护最大值就行了Max = max(dp, Max);}return Max;
}
int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}int dp[110];//dp[i]表示以i为子段尾部下标的最大子段和值。memset(dp, 0, sizeof(dp));//初始化dpfor (int i = 1; i <= n; i++) {if (dp[i - 1] < 0) {//如果以i-1为尾部下标的最大子段和小于零,则以i为尾部下标的最大子段显然不包括i之前的元素,所以dp[i]即a[i]dp[i] = a[i];}else {dp[i] = dp[i - 1] + a[i];} //即dp[i] = max(dp[i - 1] + a[i], a[i]);}for (int i = 1; i <= n; i++) {cout << "dp[" << i << "]=" << dp[i] << endl;}//函数里内容也差不多,这里输出一下看看cout << "最大子段和为:" << MaxSum_list(n, a) << endl;
}

看到dp数组动态规划后的值,可以轻松看出最大子段和为dp[4]=20.

总结:
这是一个非常简单的问题,但通过这题可以充分了解到动态规划的一些思想,但要熟练掌握dp,是一件很难的事情,还需要大量题型的磨练

这里是这个问题的拓展与推广:DP动态规划–最大子矩阵和问题(最大子段问题的推广即二维最大子段和问题)-To the Max(POJ - 1050题解)
大家可以继续学习与参考。

DP动态规划--最大子段和问题相关推荐

  1. 算法设计与分析———动态规划———最大子段和

    问题描述: 最大子段和问题是将一个n个整数的序列a[1],a[2]-.a[n]中字段a[first]-.a[last]之和,(1<=first<=last<=n)求这些子段和中最大的 ...

  2. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  3. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...

    最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...

  4. DP动态规划-爬塔(双层dp)

    DP动态规划-爬塔(双层dp) 比赛来源:牛客 - 中国计量大学现代科技学院第四届"中竞杯"程序设计校赛 题目--------F题 description: 高川最喜欢的游戏当属 ...

  5. C++入门算法1——dp(动态规划)

    dp(动态规划)是十分重要的一个算法,一般来说这种算法会比dfs(深度优先搜索)快很多. 首先先来看一道例题 题目链接:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生 ...

  6. DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)

    前言 经过基础的算法模型讲解和题海战术,将DP动态规划这个重点呢考纲进行细分题类型,此篇是上半章节的DP动态分析提升题.主要包括数字三角形,以及最大上升序列,背包问题,状态机的拆分以及优化状态机的压缩 ...

  7. 动态规划——最大子段和(hdu1003,1231)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目描述:寻找一个序列中和值最大的子段序列,例如6,-1,5,4,-7,其最大子段和为 14(6 ...

  8. 动态规划——最大子段和(洛谷 P1115)

    题目选择洛谷P1115 经典的动态规划基础题目,最大连续子序列和 状态转移方程为: dp[i] = max{A[i],dp[i-1]+A[i]} 题目描述 给出一个长度为 n 的序列 a,选出其中连续 ...

  9. hdu 1024 Max Sum Plus Plus(dp 最大m子段和)

    题意是输入m,n. m为你要求的子段个数,n为数据个数. 由于是很早的题型了,但是理解起来还是很是无力. 并于是用了三天来搞懂此类问题.发现网上大多代码无思路整个过程. 就大致讲解一下DP的整个思路. ...

最新文章

  1. java代码走查常见错误_FindBugs常见错误描述和解决方法
  2. PHP怎样防止小数点精度不丢失,javascript小数精度丢失的完美解决方法
  3. Attention 扫盲:注意力机制及其 PyTorch 应用实现
  4. linux centos7.2 nodeJs全局安装
  5. c# 中如何设置combox 让出现text value两个值 winform开发
  6. 文件上传漏洞原理与实例测试
  7. 据说微软已撤销了测试部门?
  8. Avast! 4 Server 服务器版license许可文件获得方法
  9. python的统计库_Python-Scipy库-卡方分布统计量计算
  10. c语言 switch语句实例,C语言switch语句
  11. 计算机桌面文件隐藏如何显示不出来,如何显示电脑中隐藏的磁盘分区|将电脑中隐藏的分区显示出来的方法...
  12. matlab函数性质探讨答案,matlab函数性质探讨
  13. 剑指offe 42 连续子树组中的最大和
  14. matlab将图片旋转的代码_我的MATLAB魔方新玩法:拼出任意图案!
  15. 5410 ACM 杭电 01+完全背包
  16. Leetcode|MySQL|数据库刷题记录(601~627)
  17. vh布局移动端软键盘弹起改变高度问题
  18. Apache Commons-pool2使用入门
  19. (附源码)Springboot宠物领养系统毕业设计241104
  20. thinkphp 点击分类显示分类下的文章(完整)

热门文章

  1. ajax的列表联动示例
  2. 电子企业WMS仓储管理系统解决方案
  3. 盒子科技研发部刘恒:聚合支付系统演进
  4. 移动端h5页面帮助资料干货
  5. 为您的 Vue.js 应用程序选择最佳电子商务平台
  6. 6-7 能被7或11整除的所有整数
  7. 【渝粤题库】广东开放大学 财务会计(一) 形成性考核
  8. 如何防止勒索病毒祸害医院:不要裸奔,要灾备造就安全
  9. 不用找,你想要的CAD图纸素材都在这里
  10. matlab curve fitting工具箱,[matlab工具箱] 曲线拟合Curve Fitting