您的位置:首页 > 其它

Problem3-总结报告

2016-05-29 17:51 225 查看
综述一 :动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

分类:

(1)    类斐波那契数列问题,指特征方程类似于 f(n) = f(n-1) + f(n-2),的问题,此类问题最直观的题就是斐波那契数列,稍微难一点的就是跳楼问题,和堆砖头问题,这两个题虽然看起来与斐波那契没什么关系,但是经过分析和转化之后,就可以转化为该类型。总的来说,类斐波那契数列问题是这套专题里最简单的问题,只要做会了几个典型,其他的就很简单了。

 (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
是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。

 (3)  完全背包,这个问题非常类似于01背包问题,所不同的是每种物品有无限件,也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……取[V/c]件等很多种。

(4)最大公共子序列,又称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],即问题的解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: