算法笔记之动态规划(DP)
来源:互联网 发布:日本社会的残酷知乎 编辑:程序博客网 时间:2024/05/16 17:05
动态规划(Dynamic programming)
动态规划 是解决 多阶段决策问题 的一种有效的算法设计方法,所谓的多阶段决策问题, 即 它们的活动过程可以分为若干个阶段,且任一个阶段后的行为都仅依赖于 i 阶段的状态,而与 i 之前的状态无关。
动态规划试用于两种问题,最优子结构和无后效性。
最优子结构 指的是 某个阶段的最优状态可以从之前的 某个阶段的 某个或某些状态直接得到,
无后效性 指的是 而 不用关心这些状态是怎么得来的。
也就是说, 动态规划 适用的问题 就是 某个阶段的最优状态可以从之前的 某个阶段的 某个或某些状态直接得到,而不用关心这些状态是怎么得来的。
动态规划 主要依赖于状态转移方程, 所以 ,通常这一类问题,人脑可以通过枚举的方式得到答案,但是 写成代码,需要考虑好当下的状态都依赖于哪些状态 。
最近在Leetcode上遇到很多DP的题,来个例子先(例子来自leetcode)。
1. Coin Change 2
You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.
Note: You can assume that
0 <= amount <= 50001 <= coin <= 5000the number of coins is less than 500the answer is guaranteed to fit into signed 32-bit integer
Example 1:
Input: amount = 5, coins = [1, 2, 5]
Output: 4
Explanation: there are four ways to make up the amount:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
solution :
class Solution(object): def change(self, amount, coins): """ :type amount: int :type coins: List[int] :rtype: int """ dp = [1]+[0]*amount for c in coins : for i in xrange(1, amount+1): if i >= c: dp[i] += dp[i-c] return dp[amount]
这是我在discuss区看到的一个写法简练的DP代码,值得学习。他把状态转移矩阵 dp 最开始初始全为0 ,然后每一步的状态都依赖于当前数减去c的状态,找到了这个规律,代码写起来自然流畅。最后,只需要取第amount个状态即可。
Reference
- 计算机算法基础(第3版) ,余翔宣
- http://www.math1as.com/index.php/archives/115/?utm_source=tuicool&utm_medium=referral
- https://discuss.leetcode.com/topic/78958/python-o-n-space-dp-solution
- 算法笔记之动态规划(DP)
- 算法笔记:动态规划(DP)初步
- 算法之动态规划(DP)
- 动态规划(DP)算法
- 动态规划(DP)算法
- 动态规划(DP算法)
- 动态规划(DP)算法
- 算法笔记之动态规划
- [笔记]: dp(动态规划)
- 【算法之动态规划(五)】DP规划思想学习:从《算法导论》到《算法设计》
- 【算法之动态规划(一)】动态规划(DP)详解
- 动态规划(DP)算法
- DP动态规划算法
- 动态规划(DP)算法及其应用
- 动态规划(DP)算法的介绍
- 【算法学习笔记】之动态规划
- 动态规划算法笔记
- 【算法】动态规划笔记
- 2016年全面前端面试题总结
- Spring Security笔记
- width:100%和height:auto区别
- 日期转换错误
- Android 权限配置一览
- 算法笔记之动态规划(DP)
- Paho MQTT 嵌入式c客户端研究笔记 (二)
- 冒泡排序算法总结
- linux下定时器setitimer的使用
- kubernetes helm API 客户端文件生成和远程调用
- (二)ROS中控制机器人运动(示例运行)
- 二分查找与快排算法
- gradle编译遇到的坑,持续更新
- chrome扩展开发示例之扩展页面与content_scripts建立长连接通信