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
- 动态规划3
- 动态规划详解3
- 动态规划(3)
- ITA 动态规划3
- 3动态规划
- 动态规划思考3
- 动态规划3
- 动态规划3
- 动态规划问题3
- 动态规划(3)
- 动态规划!!!动态规划!!!
- 动态规划(3)饮料供货
- 动态规划(3)饮料供货
- 动态规划3:合唱队形
- 动态规划3之1002
- 3左上角右上角动态规划
- 练习3动态规划总结
- 动态规划测试3(test20170406)
- solr服务器搭建
- 谈谈头文件
- swift字符串转double,double转字符串
- Hibernate简介
- Middle-题目106:5. Longest Palindromic Substring
- 3动态规划
- CV codes分类整理集合
- Middle-题目107:61. Rotate List
- Javascript将Form数据转化成Json对象
- 表单中 get与post提交方法的区别
- 线性表链式存储结构的C++模板类程序源代码
- Middle-题目108:79. Word Search
- mina心跳过滤器
- 第十三周项目—阅读程序,并运行结果(虚析构函数)