
动态规划
文章平均质量分 58
John_pascal
这个作者很懒,什么都没留下…
展开
-
矩阵链乘法
题目难度:★★ 对于矩阵链乘法这道题目,我们先明确一个概念: 对于n各需要相乘的矩阵所构成的(链),要计算其乘积A1A2...An。 我们需要对其加上n-1个括号,来确定其运算顺序。 例: 明白括号概念之后,我们还需明白何为矩阵相乘。 矩阵相乘或不如称为纵横相乘,意思就是对于p*q,以及q*r的两个矩阵,对于第一个矩阵的p行,对应乘以第二个矩阵的r列,所得到的一个p*r的矩原创 2016-05-29 13:03:29 · 1197 阅读 · 0 评论 -
装配线调度
题目难度:★ 题目描述: 如上图所示: 给出某样例数据最后的结果为f*=38 这道题目,如果用搜索的方法,则效率为O(2^n),效率极低,由此我们可以想到用动态规划去做。 设f(1,i)表示第一条装配线到第i个装配站时的最优时间,f(2,i)则表示第二条装配线到底i个装配站的最有时间。显然,不管当前到哪一条装配线,对于到第i个装配站只有两种路径(设当前是第一条装配线,以及原创 2016-05-28 17:48:21 · 630 阅读 · 1 评论 -
复制书稿(动规例题)
题目大意:把n个数分为连续的k段,使得每一段的最大值最小(如果多解,则前面段的数越少越好,即后面段的数越多越好) 样例输入: 9 3 1 2 3 4 5 6 7 8 9 样例输出: 1 5 6 7 8 9 输出表示把n个数如何分段,每一段的开头st和结尾en。 这道题目可以用dp的方法,设f[i,j]表示前i个数分为j段的最优值。 f[i,j]的状态转移原创 2016-04-22 22:08:23 · 1239 阅读 · 0 评论 -
滑雪(动规例题)
题目大意: 指在一个r*c的矩阵里找一些连在一起的数的最长不下降子序列。 样例输入: 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 这道题很容易想到如果要求一个点的最长不下降子序列,只能从其上下左右四个方向得来——对于每个[i,j]点,只有可能从[i+x,j+y]得来,(x,y)原创 2016-04-22 21:04:03 · 581 阅读 · 0 评论 -
【USACO题库】4.3.1 Buy Low, Buy Lower逢低吸纳
题目描述 “逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:"逢低吸纳,越低越买"这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。 以下原创 2016-04-20 21:57:19 · 1631 阅读 · 0 评论 -
低价购买(动规例题)
题目描述: 求一个最长不下降子序列,以及这个最长不下降子序列在这个序列里的个数(不能重复)。 对于第一问我们就只要普通的dp一下就行了,(以下将最长不下降子序列称为最长序列)对于第二问这里要详细的讲一下。 状态有如下: f[i]表示到第i个数的最长序列; b[i]表示到第i个数的最长序列的个数; 很容易得出方程: f[i]:=max{f[j]+1}; b[i]:=max{b[原创 2016-04-20 20:40:53 · 1250 阅读 · 1 评论 -
方格取数(动规例题)
题目描述: 对于N*N的一个矩阵中有着许多数字,规定你从左上角出发,走到右下角,走两遍,每一次走时可以取矩阵中的数字,求如何取得最大的和。 这道题可以四重循环枚举两条路所走到的位置。然后判断i,j点,h,k点是由上或左得来最大值,sum[i,j,h,k]表示第一条道路走到i,j点,第二条走到h,k点时的最优值,显然i,j,h,k有2*2四种状态: sum[i-1,j,h-1,k]原创 2016-04-19 21:13:09 · 1013 阅读 · 0 评论 -
编辑距离(动规例题)
题目描述: 现有字符串A,B,要使得A=b,有如下三种操作: 将A删除1个字符; 将A插入1个字符; 将A中的一个字符改为另一个字符; 样例输入: SFDQXBW GFDGW 样例输出: 4 解释: SFDQXBW->GFDQXBW->GFDXBW->GFDBW->GFDGW,四步。 这道题因为只能操作A,就能有效避免动态规划的无后效性,就是A的操作原创 2016-04-18 20:39:05 · 644 阅读 · 0 评论 -
乘积最大(动规例题)
题目描述: 求在一长度为N的字符串当中放k个符号所得的最大的乘积。 样例输入: 4 2 1231 样例输出: 62 这道题也是非常经典的动态规划类题目,我们先按插入的乘号来划分阶段。 设f[i,j]表示前i个数摆j个乘号所得到的最大乘积。 sum[i,j]表示i到j所组成的数字。 f[i,j]=max{f[k,j-1]*sum[k+1,i]} 这样这道题就可以pref原创 2016-04-18 20:17:52 · 531 阅读 · 0 评论 -
石子归并(动规例题)
这是一道经典的动态规划类题目,关键是数据很小,以至于3重循环的时间都轻轻松松,需要注意的是转移方程需要理解一下: 例如,f[i,j]表示的是把第i堆到第j堆内所有的石头合并成一堆的最优值。 f[i,j]=min{f[i,k]+f[k+1,j]+s[j]-s[i-1]} s[i]是表示前i堆石头的价值总和。 这个转移方程其实是把i到j分为了2部分: 然后k左边的为f[i,k],右边原创 2016-04-18 20:10:16 · 1836 阅读 · 0 评论 -
动态规划题目特性
动态规划类的题目,大体来说,可以有几个极为明显的特征: 1、此类问题是一个由多决策产生最优值的最优化问题. 决策:是指在问题可以按时间顺序分成若干相互联系的阶段,每一个阶段都需要做出决策,产生最优值,整个求解过程中的决策是一个决策序列. 最优化问题:众所周知在信息学之中有四大类问题:判定性问题、构造性问题、计数问题和最优化问题。其中最优化问题遇到的较多,而最优化问题其实就是最后的答案需求一个原创 2016-03-15 21:18:41 · 1596 阅读 · 0 评论