动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。

动态规划算法题如今很常见,通常用在求最优解问题上。DP作为求最优化的算法为什么会快?我们可以这样思考 ,无论是DP还是暴力,我们的算法都是在可能解空间内,寻找最优解。DP是枚举有希望成为答案的解。从而我们可以得到DP的核心思想:尽量缩小可能解空间。在暴力算法中,可能解空间往往是指数级的大小;如果我们采用DP,那么有可能把解空间的大小降到多项式级。一般来说,解空间越小,寻找解就越快。这样就完成了优化。
下面通过一些简单的动态规划的题目来理解这个算法:

1. 1.打家劫舍


题中给出的限制是不能选两个相邻直接的数字,否则会自动报警。
我们给出一个数组dp,存储当前偷窃的最高金额,nums是题目中给出的数组。
dp[0] = nums[0]
dp[1] = max(nums[0],nums[1])
dp[2]呢,
这时候我们可以想一下,dp[2]是不是有两种情况,
第一种情况是选dp[0]后加上nums[2],
第二种情况是选dp[1],nums[2]相邻不可以选
然后取两种情况的最大值,就是dp[2]。
其实就是选与不选之间的决策,最后我们由小部分的最优解可以推算出总共的最优解,这就是动态规划,
状态转移方程为:dp[i] = max(dp[i-1],dp[i-2]+nums[i])
初始条件为dp[0] = nums[0] ,dp[1] = max(nums[0],nums[1])
由这两个条件我们可以写出以下代码:

class Solution {public:int rob(vector<int>& nums) {int size = nums.size();if (size == 0) return 0;if (size == 1)return nums[0];vector<int> dp(size, 0);dp[0] = nums[0];dp[1] = nums[0]>nums[1] ? nums[0] : nums[1];for (int i = 2; i < size; ++i){dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);}return dp[size - 1];}
};

动态规划总结以及状态转移方程的推导(一)相关推荐

  1. 【编程学习笔记】动态规划的核心——状态转移方程(递归方程)

    在上一章中讲了基本的动态规划思路,但上一章中的状态转移(即小问题之间的关系)过于简单. (上一章:https://blog.csdn.net/qq_42152365/article/details/1 ...

  2. 洛谷 P1164 小A点菜(01背包状态转移方程详细推导)

    题目链接 今天刷题,本来背包问题感觉稳稳的懒得刷了,随手做两个就被卡住了, 原来自己只会做死板的背包,这种稍微变形的就不会推状态转移方程了 我又去看了一眼滚动背包的转变方法 加上大佬的题解,才稍微明白 ...

  3. 动态规划1:状态转移方程-求最大子序列和

    时间复杂度O(n) 序列:-2 11 -4 13 -5 -2 //最大连续子序列和 //使用到状态转移方程 #include <cstdio> #include "algorit ...

  4. 动态规划经典算法状态转移方程总结

    最大连续子序列和 dp[i] = max(dp[i - 1] + nums[i], nums[i]) 最长上升子序列 dp[i] = max(1, dp[j] + 1) (j = 0...i - 1 ...

  5. 算法设计 - 01背包问题的状态转移方程优化,以及完全背包问题

    01背包问题的一维状态转移方程的推导 前提摘要 前面这篇博客中: 算法设计 - 01背包问题_伏城之外的博客-CSDN博客 我们已经推导出了01背包问题的二维数组dp状态转移方程公式: 假设有N种不同 ...

  6. 动态规划-如何推导出状态转移方程?

    今天学习了<程序员的数据基础课>中的动态规划小节.如果你觉得这个课程对你有启发,请通过 分享一个IT专属的数学课,让这个冬天不太冷 下方的链接购买,加我微信 somenzz,返你 12 元 ...

  7. c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周三算法与数据结构专题的第12篇文章,动态规划之零一背包问题. 在之前的文章当中,我们一起探讨了二分.贪心.排序和搜索算法,今天我们来 ...

  8. 运筹学状态转移方程例子_如何确定动态规划的转移方程

    先观察最后一个状态 比如 LintCode 114 ,题意是从一个二维数组的左上角走到右下角共有多少种不同的路径.且每次只能向下或者向右走一步,最后一个状态就是右下角 2. 观察到达最后一个状态的前面 ...

  9. 运筹学状态转移方程例子_动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 规划论 Mathematical Programming / Mathematical Optimization In mathematics, computer ...

最新文章

  1. cfa英语不好的怎么学_英语和数学不好,还怎么学CFA?!
  2. Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputFormat的map任务数量)...
  3. OpenGL绘制五颜六色的三角形并旋转
  4. python代数式的表达方式_关于python字典类型最疯狂的表达方式
  5. leetcode python3 简单题100. Same Tree
  6. 如何使用MySQL进行备份?
  7. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_17_注解_解析注解...
  8. hive explain 源码分析
  9. ubuntn 16.04.2下caffee的安装教程
  10. 练字一定要用钢笔吗?
  11. python模拟火车票订票系统_除夕火车票明天开售,上海各大火车站售票时间都在这...
  12. 基于Arduino的蓝牙电子秤
  13. CDR各版本文件不兼容的原因
  14. php 字母数字下划线,CTF踩坑PHP编写一个不包含数字字母和下划线的后门
  15. 计算机lg符号,网上总出现LG的符号,是什么意思
  16. 微信提现——企业付款到零钱demo(超详细小白都看得懂的)
  17. 硬替换WIN10雅黑和宋体的苹方字体
  18. Python爬虫进阶必备 | 某镜像网站分析 - 教程随你出,学会算我输
  19. word2019写论文 加没有序号和上方横线的脚注
  20. 员工管理系统(图形界面带数据库 )

热门文章

  1. 谷歌插件Fetch在不同页面之间Cookie携带情况详解
  2. Kali应用及渗透测试
  3. Django 商城购物车页面
  4. ubuntu中eclipse安装pydev不显示的解决方法
  5. 2021年危险化学品经营单位安全管理人员考试技巧及危险化学品经营单位安全管理人员
  6. SharePoint 集成OWA实战教程-杨建宇(霖雨)-专题视频课程
  7. android逆向必备工具
  8. 关于蘑菇街兼并美丽说。
  9. [OneDrive下载]——让你在云端畅游自如
  10. [转载]如果你是12306网站架构师,你会如何设计网站的软件架构和硬件系统架构?...