动态规划(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. 训练集(train set) 验证集(validation set) 测试集(test set)
  2. html5电影在线看,HTML5-电影影评网
  3. VMware虚拟机的联网(图)
  4. vi测试仪维修成功率高吗?_欧森杰检测仪:臭氧检测仪的六大特点,您真的了解吗?...
  5. react中使用charles实现本地数据mock
  6. 《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时...
  7. 从2D恢复出3D的数据
  8. ENVI标准库下光谱分析
  9. HDU 1081 To The Max
  10. Ajax程序设计入门
  11. Linux宝库快讯 | OpenStack中国日更名OpenInfra中国日
  12. laravel如何利用数据库的形式发送通知
  13. html设置字体 圆体,css font-family字体大合集
  14. mysql 向上取整_mysql的取整函数
  15. 呼吸运动减肥法-可以加快新陈代谢
  16. python课本图片_python爬虫当当网python书籍图片
  17. 英文文本分类——电影评论情感判别
  18. 机电设备如何有效监控?手把手教你最实用的
  19. android studio 使用夜神模拟器
  20. 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

热门文章

  1. 华为以太网链路聚合原理及配置
  2. 脊髓损伤早期康复的误区你都知道吗?
  3. neutron如何加载的plugin类
  4. kali渗透测试与安全
  5. Vdbench工具的安装及使用
  6. python求解全局莫兰指数和局部莫兰指数
  7. Oracle数据库信息分类汇总计数
  8. java形参列表怎么理解_关于Java中形参与实参的理解
  9. 拉萨——哲蚌寺(一)
  10. 从百播大战到倒闭潮 2017年直播行业该往哪走?