零、前言
1.三个性质
有必要对动归的三个性质进行一些说明分析,以后的所有题都要贯穿这些思想
(1)相同子问题:
一个大问题分解为若干小问题,小问题与大问题形式上相同(下面例子中用箭头表示了状态的转移关系)
①数字三角形:从某一个点到底边的最大和<=其正下方点到底边的最大和和斜下方点到底边的最大和
②最长上升子序列:以某一个点i为结尾的最长上升子序列<=这个点之前任何一个满足a[j]<=a[i]的j为结尾的最长上升子序列
③爬楼梯:走n步的走法<=走n-1步的走法,走n-2步的走法
(2)最优子结构:
问题是最优的,它的子问题也必须是最优的
(3)无后效性:
dp只能用于当前决策与过去状态无关的问题,即过去的决策是否会使得当前的决策受限,当前有的决策不能做或产生其他新决策
①数字三角形:在已知,正下方点到底边的最大和,斜下方点到底边的最大和,的情况下,可以确定该点到底边的最大和,无需考虑走到当前点的路径不同的话会不会导致现在的决策有一些不能做这样的问题
②最长上升子序列:(已知i,j定义的情况下)dp[i]必然会由dp[j]产生,无需考虑dp[j]内部到底有哪些元素,是否会导致a[i]不能选这样的问题
③爬楼梯:已知走n-1步的走法,走n-2步的走法,无需考虑这些走法中某些走法是不是可能导致当前无法走1步或2步这样的问题
2.解题步骤
1.确定状态,注意维度
2.确定状态转移方程,注意无后效性和边界设定
3.确定使用递推还是记忆化搜索来实现(可以递归的一定可以记忆化搜索,但有的只能记忆化搜索)
3.递推和记忆化搜索的问题
1.递推:(自底向上)问的是n状态,从1状态推得;有两种递推的情况,“人人为我”最为普遍,即以前的状态推得当前状态,“我为人人”即用当前更新了的状态更新所有这个状态可以更新到的状态,虽然这样的更新不一定就确定了后面的状态
2.记忆化搜索(递归):(自顶向下)问的是n状态,从n状态搜索需要的子状态,求出子状态并记录;能够只搜索有用的状态,但是,有可能会爆栈,而且不能够优化空间