动态规划学习

参考: 五大常用算法之二:动态规划算法

Concept:动态规划: 多阶段最优化决策解决问题的过程.

每次决策依赖于当前状态,又随即引起状态迁移,一个决策序列就在变化的过程中产生出来.

Mechanism:

分阶段解决子问题,按顺序求解子问题,前一子问题的解为后一子问题提供信息.

在求解任一问题时,列出可能的局部解, 保留能到达最优解的局部解, 丢弃其他局部解.

依次解决各个子问题, 最后一个子问题就是初始问题的最优解.

动态规划解决的问题多有子问题重叠的特点

二维数组: 存储重叠的子问题的解(状态)

与分治法的差别

时间: 2024-08-06 18:34:57

动态规划学习的相关文章

动态规划学习笔记(不定期更新)

最近刚开始接触动态规划(Dynamic Programming)算法,之前略有耳闻,一直觉得DP非常之高大上,看了某些题的DP解法也是云里雾里,哇擦?!这么几行代码就解决了?怎么全是数组操作?时间复杂度也很低的样子.其实不然,当我真正开始学习动态规划的时候才发现这货没那么玄乎. 把我对DP浅显的理解总结为以下几点: 1.空间换时间. 2.找到状态. 3.找到状态转移方程. 动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决.为了能够快速的不重复的计

动态规划学习中的一道题目

记得初中时候的一篇文章说,做学问,必须要有学和问两个方面. 做了一些动态规划题目之后偶然看到这个介绍动态规划的文章.然后遇见第一道题目就卡壳. 经过反思文章以及自己思考,总算对题目有了一些理解.下面分享给大家,初学者们看到这个题目不至于太过茫然——像我一样. 工厂生产某种产品,每单位(千件)的成本为1(千元),每次开工的固定成本为3(千元),工厂每季度的最大生产能力为6(千件).经调查,市场对该产品的需求量第一.二.三.四季度分别为        2,3,2,4(千件).如果工厂在第一.二季度将

动态规划学习系列——划分DP(二)

划分型DP第二题,wikioi 1039,与第一题乘积最大思路有所不同. 题目要求: 将一个数划分成几部分,问一共有多少种分法. 真 · 解题思路: 其实跟小学奥赛的一些题有点像,我们先来看一个例子: 7 分成 3 部分,有四种办法: 1,1,5:1,2,4:1,3,3:2,2,3 . 我们人脑来考虑问题的时候是怎么想的呢?显然,从1开始,1是第1部分,然后剩下6分成2部分,我们依然是从1开始考虑,1是第2部分,然后5是第3部分:同样接下来考虑第2部分是2,则第3部分是4:接着考虑第2部分是3,

动态规划学习笔记--对于钢条切割方案的思考

1.问题描述 对一个长为n的钢条,给出不同长度钢条对应的单价,求出如何切割能使得该钢条的收益最大化. 2.问题解析 (1)暴力法 找出所有切割方案(共2^(n-1)种),计算出每种切割方案的收益,求最大值. 时间复杂度:O(2^(n-1)) (2)动态规划 这一问题是<算法导论>中,讲解动态规划的例题. 为什么这题能够用动态规划解决呢? 动态规划是用来解决具有以下性质的问题的: 1.最优子结构 2.重复子问题 这两个性质,显然前者更为重要,而后者没有也可以用动态规划解决(我现在这么认为). 动

动态规划学习记录

首先是入门级别的一维dp. 这个是凑硬币,如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划算法的核心是:每个子问题的状态和状态的转移方程. 状态是:dp[i] ,即凑够i元最少需要的硬币的个数 转移方程是:dp[i] = min(dp[i-C 1 ]+1,dp[i-C 2 ]+1,dp[i-C 3 ]+1,……,dp[i-C j ]+1]) 即,每个状态的值都是最小的那个. #include<stdio.h>#define min(a,b) a<b?a

动态规划学习系列——划分DP(一)

划分型DP,是解决跟划分有关的题目的一种DP思路,个人觉得,是目前接触的DP类型中最难的一种,因为感觉思路并不确定,不过正是不确定,才可以体会到算法的精妙之处. 题目链接:wikioi_1017 要求是将一个n位的数分成m部分,使各部分的乘积最大.解题的思路基于一个事实:当前的数可以分成m-1部分,那么加多几位分成m部分不是可以从原来的推出来.从这句差不多是废话的话中我们就可以推出状态转移方程: dp[i][k]=max(dp[i][k],dp[j][k-1]*a[j+1][i]); ( k <

动态规划学习系列——划分DP(三)

划分DP第三题,wikioi 1040,送我n个WA~~~ 题目大意: 这道题题述有着UVA的特色,够废话,其实就是读入一个长度最大200的字符串(不知道为何要分行输入,完全没有意义啊),分成m部分,使各部分单词量加起来最大 解题思路: 这题划分的部分跟乘积最大那题其实很像,状态转移方程也很容易想到: dp[i][k]=max(dp[i][k],dp[j][k-1]+scnt[j+1][i]) ( j >= k-1 ) scnt数组:scnt[j][i] 表示区间 j~i 所包含的单次总数 接下

【2016.5.7】动态规划学习日记

第一题: problem:http://coj.cnuschool.org.cn/oj/home/problem.htm?problemID=858 scope:↑↑↑ solve: 1.f[i]表示从第1个数到第i个数的最长不下降子序列长度. 2.1<=i<=n 3.f[i]=max(f[1...(i-1)]); 4.a[1...n]=1; 5.i++ j++ 6.ans=max(f[1...n]); 7.O(n^2)

动态规划学习笔记

案例1.最长回文序列一个字符串有许多子序列,比如字符串abcfgbda,它的子序列有a.bfg.bfgbd,在这些子序列中肯定有回文字符串.现在要对任意字符串求其最长的回文子序列.注意,本文不是解决最长回文子串,回文子串是连续的,回文子序列是不连续的.字符串abcfgbda的最长回文子序列为abcba,长度为5.输入:包含若干行,每行有一个字符串,字符串由大小写字母构成,长度不超过100.输出:对每个输入,输出一行,该行有一个整数,表示最长回文子序列的长度. ExampleInput: aabc