动态规划总结以及状态转移方程的推导(一)
动态规划(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];}
};
动态规划总结以及状态转移方程的推导(一)相关推荐
- 【编程学习笔记】动态规划的核心——状态转移方程(递归方程)
在上一章中讲了基本的动态规划思路,但上一章中的状态转移(即小问题之间的关系)过于简单. (上一章:https://blog.csdn.net/qq_42152365/article/details/1 ...
- 洛谷 P1164 小A点菜(01背包状态转移方程详细推导)
题目链接 今天刷题,本来背包问题感觉稳稳的懒得刷了,随手做两个就被卡住了, 原来自己只会做死板的背包,这种稍微变形的就不会推状态转移方程了 我又去看了一眼滚动背包的转变方法 加上大佬的题解,才稍微明白 ...
- 动态规划1:状态转移方程-求最大子序列和
时间复杂度O(n) 序列:-2 11 -4 13 -5 -2 //最大连续子序列和 //使用到状态转移方程 #include <cstdio> #include "algorit ...
- 动态规划经典算法状态转移方程总结
最大连续子序列和 dp[i] = max(dp[i - 1] + nums[i], nums[i]) 最长上升子序列 dp[i] = max(1, dp[j] + 1) (j = 0...i - 1 ...
- 算法设计 - 01背包问题的状态转移方程优化,以及完全背包问题
01背包问题的一维状态转移方程的推导 前提摘要 前面这篇博客中: 算法设计 - 01背包问题_伏城之外的博客-CSDN博客 我们已经推导出了01背包问题的二维数组dp状态转移方程公式: 假设有N种不同 ...
- 动态规划-如何推导出状态转移方程?
今天学习了<程序员的数据基础课>中的动态规划小节.如果你觉得这个课程对你有启发,请通过 分享一个IT专属的数学课,让这个冬天不太冷 下方的链接购买,加我微信 somenzz,返你 12 元 ...
- c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周三算法与数据结构专题的第12篇文章,动态规划之零一背包问题. 在之前的文章当中,我们一起探讨了二分.贪心.排序和搜索算法,今天我们来 ...
- 运筹学状态转移方程例子_如何确定动态规划的转移方程
先观察最后一个状态 比如 LintCode 114 ,题意是从一个二维数组的左上角走到右下角共有多少种不同的路径.且每次只能向下或者向右走一步,最后一个状态就是右下角 2. 观察到达最后一个状态的前面 ...
- 运筹学状态转移方程例子_动态规划 Dynamic Programming
从运筹学和算法的角度综合介绍动态规划 规划论 Mathematical Programming / Mathematical Optimization In mathematics, computer ...
最新文章
- 训练集(train set) 验证集(validation set) 测试集(test set)
- html5电影在线看,HTML5-电影影评网
- VMware虚拟机的联网(图)
- vi测试仪维修成功率高吗?_欧森杰检测仪:臭氧检测仪的六大特点,您真的了解吗?...
- react中使用charles实现本地数据mock
- 《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时...
- 从2D恢复出3D的数据
- ENVI标准库下光谱分析
- HDU 1081 To The Max
- Ajax程序设计入门
- Linux宝库快讯 | OpenStack中国日更名OpenInfra中国日
- laravel如何利用数据库的形式发送通知
- html设置字体 圆体,css font-family字体大合集
- mysql 向上取整_mysql的取整函数
- 呼吸运动减肥法-可以加快新陈代谢
- python课本图片_python爬虫当当网python书籍图片
- 英文文本分类——电影评论情感判别
- 机电设备如何有效监控?手把手教你最实用的
- android studio 使用夜神模拟器
- 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps