没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
常见动态规划问题总结
标签:ACM
解题关键:
理解结构特征,抽象出状态,写成状态转移方程。
动态规划理念:
1.最优化原理
1951年美国数学家R.Bellman等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单
阶段问题,然后逐个加以解决。一些静态模型,只要人为地引进“时间”因素,分成时段,就可以转化成多阶段的动
态模型,用动态规划方法去处理。与此同时,他提出了解决这类问题的“最优化原理”(Principleofoptimality):
“一个过程的最优决策具有这样的性质:即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作
为初始状态的过程而言,必须构成最优策略”。简言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。
这个“最优化原理”如果用数学化一点的语言来描述的话,就是:假设为了解决某一优化问题,需要依次作出n个决策D1,
D2,…,Dn,如若这个决策序列是最优的,对于任何一个整数k,1<k<n,不论前面k个决策是怎样的,以后的最优决策
只取决于由前面决策所确定的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。
最优化原理是动态规划的基础。任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。能采用
动态规划求解的问题都需要满足一定的条件:
(1)问题中的状态必须满足最优化原理;
(2)问题中的状态必须满足无后效性。
所谓的无后效性是指:“下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总
结”。
2.问题求解模式
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决
策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设
计都有着一定的模式,一般要经历以下几个步骤。
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
图1动态规划决策过程示意图
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或
者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满
足无后效性。
(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出
本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两段各状态之间的关
系来确定决策。
(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
3.实现
动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。使用动态规
划求解问题,最重要的就是确定动态规划三要素:问题的阶段,每个阶段的状态以及从前一个阶段转化到后一个阶段之间的
递推关系。递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来
实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优
势,这也是动态规划算法的核心之处。确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决
策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态
下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列
优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。下面分别以求解最大化
投资回报问题和最长公共子序列问题为例阐述用动态规划算法求解问题的一般思路。
动态规划经典例题:
1.三角形找一条从顶到底的最小路径
分析
设状态为f(i;j),表示从从位置(i;j)出发,路径的最小和,则状态转移方程为
f(i,j)=min{f(i+1,j),f(i+1,j+1)}+(i,j)
2.最大子数组和
设状态为f[j],表示以S[j]结尾的最大连续子序列和,状态转移方程如下:
f=max(f+A[i],A[i]);//对于数组里的一个整数,它只有两种选择:1、加入之前的SubArray;2.自己另起一个
SubArray。
maxsum=max(maxsum,f);//求字串中最大的
3.回文最小划分次数
对输入的字符串划分为一组回文字符串,最小的分割次数
所以要转换成一维DP。如果每次,从i往右扫描,每找到一个回文就算一次DP的话,就可以
转换为f(i)=区间[i,n1]之间最小的cut数,n为字符串长度,则状态转移方程为
4.最佳时间买卖股票
设状态f(i)表示区间[0,i1]上的最大利润,设置状态g(i),表示区间[i,n1]上最大利润。
则最大利润为max{f(i)+g(i)};允许在一天内买进又卖出,相当于不交易,因为题目的规定是最多两次,而不是一定要
两次
5.判断字符串s3是否由s1,s2交叉存取组成
设状态f[i][j],表示s1[0,i]和s2[0,j],匹配s3[0,i+j]。如果s1的最后一个字符等于s3的最后一个字符,则
f[i][j]=f[i1][j];
如果s2的最后一个字符等于s3的最后一个字符,则
f[i][j]=f[i][j1]。
因此状态转移方程如下:
f[i][j]=(s1[i1]==s3[i+j1]&&f[i1][j])||(s2[j1]==s3[i+j1]&&f[i][j1]);
6.给定一个矩形表格,求从顶到底的最小和
MinimumPathSum
设状态为f[i][j],表示从起点(0;0)到达(i;j)的最小路径和,则状态转移方程为:
f[i][j]=min(f[i1][j],f[i][j1])+grid[i][j]
7.使两个字符串相等,最小的编辑次数
EditDistance
设状态为f[i][j],表示A[0,i]和B[0,j]之间的最小编辑距离。设A[0,i]的形式是
str1c,B[0,j]的形式是str2d,
1.如果c==d,则f[i][j]=f[i1][j1];
2.如果c!=d,
(a)如果将c替换成d,则f[i][j]=f[i1][j1]+1;
(b)如果在c后面添加一个d,则f[i][j]=f[i][j1]+1;
(c)如果将c删除,则f[i][j]=f[i1][j]+1;
8.给定一串数字,1对应A,2对应B,26对应Z,求有多少种解码方式
DecodeWays
和爬楼梯问题一样,
设f(n)表示爬n阶楼梯的不同方法数,为了爬到第n阶楼梯,有两个选择:
•从第n1阶前进1步;
•从第n2阶前进2步;
因此,有f(n)=f(n1)+f(n2)。这是一个斐波那契数列。
9.不同的子序列DistinctSubsequences
给定2个字符串a,b,求b在a中出现的次数。要求可以是不连续的,但是b在a中的顺序必须和b以前的一致。
Hereisanexample:S="rabbbit",T="rabbit"
Return3.
类似于数字分解的题目。dp[i][j]表示:b的前j个字符在a的前i个字符中出现的次数。
如果S[i]==T[j],那么dp[i][j]=dp[i1][j1]+dp[i1][j]。
意思是:如果当前S[i]==T[j],那么当前这个字母即可以保留也可以抛弃,所以变换方法等于保留这个字母的变换方
法加上不用这个字母的变换方法。
如果S[i]!=T[i],那么dp[i][j]=dp[i1][j],
意思是如果当前字符不等,那么就只能抛弃当前这个字符
递归公式中用到的dp[0][0]=1,dp[i][0]=0(把任意一个字符串变换为一个空串只有一个方法
10.单词分解WordBreak
字符串是否可以分解为给定的单词
Forexample,given
s="leetcode",
dict=["leet","code"].
dp[i]表示源串的前i个字符可以满足分割,那么dp[j]满足分割的条件是存在k使得dp[k]&&substr[k,j]在字典
里。
真题:
剩余17页未读,继续阅读
资源评论
蚍蜉_
- 粉丝: 152
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功