3动态规划

来源:互联网 发布:泛型 java 方法 编辑:程序博客网 时间:2024/05/16 11:23

此次专题主要讲解动态规划,题目大致分为两类 一种是递归来解决,一种是0/1背包问题。

动态规划就是把一个问题分成多个阶段来解决,并且每个阶段都相互有所联系。其遵循最优性原理。

1,不论初始状态和第一步决策是什么,余下的决策相对于前一次决策所产生的新状态,构成一个最优决策序列。

2,最优决策序列的子序列,一定是局部最优决策子序列。
3,包含有非局部最优的决策子序列,一定不是最优决策序列。
根据老师课件可以总结为解题步骤:
1,把问题分为若干个子问题就是分为若干个阶段
2,建立状态转移方程,一般是递推公式
3,找出边界条件
4,将边界值代入方程
5,递推求解

一,递归问题。
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
这是一道简单的递归问题,没上一个台阶看做阶段,从第三层就能找出规律,他的状态转移方程为f(n) = f(n-1)+f(n-2)
之后将边界值带入就能求解。
二,求最长序列问题。
求公共最长子序列的题,首先要区别子序列与字串。子序列是可以不连续的,而字串一定是连续的。
我一般的做法就是建立动态规划数组dp[i][j]代表当比较到两个字符串的尽头时的最大公共子序列就是dp[i][j]
如图:

状态转移方程为:dp[i][j] = most(dp[i-1][j],dp[i][j],dp[i][j-1])分别是一串与二串之前有相同字符,同位有相同字符,之后有相同字符,取最大值。
三,0/1背包问题
典型题目:给你物品数目以及背包的容量,下面是各个物品的价值以及容量,让你求背包能装入的最大价值
状态转移方程:dp[i][j] = most(dp[i][j],dp[i-1][j-w[i])+v[i]);
w[i]即第i件物品的重量 v[i]第i件物品的价值dp[i][j]把前i件物品装入j容量的背包中所能获得的最大价值。
对每件物品就有两种选择,放或者不放,取其最大值,如果放这件物品则为dp[i-1][j-w[i]] + v[i],前i-1件物品放入j-w[i]的容量中所能获得的最大价值,如果不放就是dp[i-1][j]。
完全背包问题,在0/1背包问题的基础上,每种物品不单单是一件了,而是多件。

1) 子问题定义:F[i][j]表示前i物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值。

        2) 根据第i物品放多少件进行决策

  dp[i][j] = max(f[i-1][j-k*w[i]) + k*v[i],f[i-1][j]) 0<=k*w[i]<=j 就是比0/1背包问题多加了一层每种物品数量的循环

还有分组背包问题,把物品分成若干组,在每一组中求最优。






0 0
原创粉丝点击