动态规划
动态规划—–>一类思想
动态规划:
线性动态规划
区间动态规划
背包问题
状态压缩动态规划
树型动态规划
插头动态规划
数位动态规划
......
运筹学 决策过程最优化
一般用来求解最优解问题
递归与DP区别:
递归:将求解的问题分解为若干个同类的子问题,子问题是否相互独立不影响
DP:将待求解问题分解成若干个子问题,先求解子问题,然后从子问题的解得到原问题的解,并且子问题之间往往不是互相独立的
DP问题两个性质:
1.最优子结构性质
2.重叠子问题性质
动态规划:将待求解问题分解成若干个子问题,先求解子问题,
然后从子问题的解得到原问题的解,并且子问题之间往往不是互相独立的
求解DP类型问题:递归
斐波那契数列:
1.递归实现---->记忆化搜索----->自上而下求解
2.非递归实现(DP table)---->迭代----->根据1中的记忆化数组,找到数组之中数据的关系----->自下而上求解
DP解题思路:
1.辨别是不是DP问题
2.状态数组:
状态:子问题的状态/解
找状态数组:
(1)用参数来描述状态,用一句话描述最终问题状态
(2)或者搜索----->记忆化优化----->记忆化数组就是状态数组
3.找状态转移方程:状态数组中状态之间的关系
(1)站在中间状态的角度考虑i,默认前i-1个状态的值已经知道
(2)搜索----->记忆化优化----->记忆化记录答案过程,隐含了转移公式
4.写代码:写法1或写法2
01背包问题: 有N种不同物品和一个容量为C的背包,每种物品有自己的重量w和价值v,,并且每种物品只有一件,可以装下物品的最大价值是多少?
1.辨题---->DP
2.状态数组:
(1)从前n个物品中选择若干个,重量不超过C,价值最大
dp[n][c] = ans;
dp[i][j] = x; 从前i个物品中选择若干个,重量不超过j,价值最大为x
dp[0][j]=0 dp[i][0]=0
(2)暴力搜索
3.找状态转移方程:状态数组中状态之间的关系
(1)站在中间状态的角度考虑i,默认前i-1个状态的值已经知道
(2)搜索----->记忆化优化----->记忆化记录答案过程,隐含了转移公式
4.写代码:写法1或写法2