1. 暴力解决——递归
2. 记忆搜索——不关心计算的顺序O(N*aim2)
建立一个map:将需要递归的参数当作key,将结果当作value
3. 动态规划——规定计算的顺序。本质是使用额外的空间记录每一暴力搜索的结果——O(N*aim2)—>O(N*aim)
1. 建立一个矩阵dp
2. 按照计算顺序(一般从左到右,从上到下),记录每一次计算的结果
1)建立矩阵:dp[i][j]:代表货币为:arr[0...i]组成j的组合可能
| 0 | 1 | 2 | ... | j - 1 | j | ... | aim | |
| 0 | ||||||||
| 1 | ||||||||
| 2 | ||||||||
| ... | ||||||||
| i -1 | dp[i-1][j] | |||||||
| i | dp[i][j-1] | dp[i][j] | ||||||
| ... | ||||||||
| N-1 |
初始化矩阵:
2)分析:dp[i][j] =
总结:dp[i][j] = dp[i-1][j] + dp[i-1][j -arr[i]] + dp[i-1][j-2*arr[i]] +...
=dp[i][j-arr[i]] + dp[i-1][j] ——O(N*aim)
给定矩阵m:M*N,例如:
| 1 | 3 | 5 | 9 |
| 8 | 1 | 3 | 4 |
| 5 | 0 | 6 | 1 |
| 8 | 8 | 4 | 0 |
1)设定矩阵dp:M*N,dp[i][j]代表,到达(i,j)的最小路径和
| 1 | 4 | 9 | 18 |
| 9 | |||
| 14 | |||
| 22 |
2)分析dp[i][j]:
1. 初始化:dp[i][0] = dp[i-1][0] + m[i][0]
dp[0][j] = m[0][j] + dp[0][j-1]
2. 对于dp[i][j] = min{dp[i-1][j],dp[i][j-1]}
例如:arr=[2, 1, 5, 3 ,6, 4, 8, 9, 7]
dp = [1, 1, 2, 2, 3, 3, 4, 5, 1],最后输出5
1)设一个dp[i],代表arr[0...i]的最长递增子序列长度
2)dp[i] = max{dp[j] = 1, 0<=j <=i and arr[j] < arr[i]},如果不满足,则为1
str1:M, str2:N,建立M*N 的矩阵dp,其中dp[i][j]代表str1[0....i]和str2[0...j]的最长公共子序列
1)初始化
| 0 | 1 | 2 | ... | j - 1 | j | ... | aim | |
| 0 | ||||||||
| 1 | ||||||||
| 2 | ||||||||
| ... | ||||||||
| i -1 | dp[i-1][j-1] | dp[i-1][j] | ||||||
| i | dp[i][j-1] | dp[i][j] | ||||||
| ... | ||||||||
| N-1 |
2)比较dp[i-1][j-1]、dp[i-1][j-1]、dp[i-1][j-1],得到最长的。再次基础上根据元素是否相同,确定是否+1
1)创建矩阵dp[i][j],代表前i件物品,不超过重量j的最大价值
2)分析dp[i][j]:
取这两个的最大值。则最终dp最右下角的值就是结果。
1)设str1、str2长度分别为M、N,创建一个M*N的矩阵,其中dp[i][j]代表:str[0~i-1]——>str2[0~j-1]的最小代价
2)初始化:
3)dp[i][j]四种情况:
原文:http://www.cnblogs.com/lesleysbw/p/6567620.html