SDAU练习三总结

 动态规划程序设计是对解最优化问题的一种途径,是解决多阶段决策问题的一种方法。在每一个阶段都需作出决策,并影响到下一个阶段的决策。多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解 题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。
 
    动态规划问题运算量比较大,在本套专题中遇到的DP问题类型:类斐波那契数列问题,01背包(以1019,1017题为例),完全背包(以1022题为例),最长升序子序列问题,最大公共子序列(以1002题为例)问题。
 
    类斐波那契数列问题,指特征方程类似于 f(n) = f(n-1) + f(n-2),的问题,此类问题最直观的题就是斐波那契数列,稍微难一点的就是跳楼问题,和堆砖头问题,这两个题虽然看起来与斐波那契没什么关系,但是经过分析和转化之后,就可以转化为该类型。总的来说,类斐波那契数列问题是这套专题里最简单的问题,只要做会了几个典型,其他的就很简单了。
 
    01背包,一般描述为给定背包的容积,一些物品的价值和体积,求能放入背包中的物品的最大价值,一个比较通用的公式为f[i, j] = max( f[i-1, j-Wi] + Pi (j >=Wi), f[i-1, j] ),这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。
 
    完全背包,这个问题非常类似于01背包问题,所不同的是每种物品有无限件,也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……取[V/c]件等很多种。
 
    最大公共子序列,又称LCS,由于上课老师没有讲过,便自己学习了一下,这类问题一般描述为给定一定个字符串,求出个个串最长的公共子序列的长度,这种问题的解决思路很巧妙,用一个矩阵,行和列每个格子代表一个字符,分别表示出两个字符串,如图,引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS 的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们根据X[i] = Y[j]还是X[i] != Y[j],就可以计算出c[i][j],即问题的解。

 
感想: 动态规划问题,代码量很少,一个贪心或者搜索问题,一般都会有五六十行代码,而一个DP问题的代码量,往往就十几行甚至更短,以至于真正的核心就那么一行递推公式。但这并不代表DP问题就简单,做DP问题需要很强的逻辑思维和思考能力,做DP问题,是真正用“脑子”做题,不是像搜索一样,靠“模板”来嵌套。 
心得:经过一段时间的刷题与适应,虽然最终的结果不尽如人意,但是在老师细心地讲解,自己也努力的求师求解,在豆豆的帮助下,也算是完成了这一阶段的学习,希望自己以后能更努力一点,天道酬勤!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值