面试会考的动态规划DP总结

先挖个坑,今天听了两个小时的DP,深有收获,先把笔记贴在这里。过阵子来整理。。。


1 DP适用的题目:

-求最值 Jump Game II Palindrome Partitioning II Edit Distance Minimum Path Sum Triangle 
-可行不可行  Jump Game Word Break Interleaving String 
-求方案总数 eg: Climbing Stairs Decode Ways  Distinct Subsequences Unique Paths Unique Paths II 

但是如果要求具体每个方案:DFS  eg: Combination Sum Combination Sum II 

2 DP的分类:

Sequence DP

Q1. Climbing Stairs

http://oj.leetcode.com/problems/climbing-stairs/

Q2. Decode Ways

http://oj.leetcode.com/problems/decode-ways/

Q3. Jump Game I, II

http://oj.leetcode.com/problems/jump-game/

http://oj.leetcode.com/problems/jump-game-ii/

Q4. Palindrome Patitioning II

http://oj.leetcode.com/problems/palindrome-partitioning-ii/

Q5. Word Break

http://oj.leetcode.com/problems/word-break/

Two Sequences DP

Q6. Distinct Subsequences

http://oj.leetcode.com/problems/distinct-subsequences/

Q7. Edit Distance

http://oj.leetcode.com/problems/edit-distance/

Q8. Interleaving String (Review)

http://oj.leetcode.com/problems/interleaving-string/

Matrix DP

Q9. Minimum Path Sum

http://oj.leetcode.com/problems/minimum-path-sum/

Q10. Triangle

http://oj.leetcode.com/problems/triangle/

Q11. Unique Path I, II

http://oj.leetcode.com/problems/unique-paths/

http://oj.leetcode.com/problems/unique-paths-ii/


3 DP的几个要素:

1找状态status意义!
// Matrix: f[i][j] 表示从1,1走到i,j
// sequence: f[i] 表示前i个。。。
// 2 sequence: f[i][j] 表示前i个匹配上前j个
// interval:f[i][j] 表示区间i->j


2 转移方程 

LCS:f[i][j] = max(f[i-1][j],f[i][j-1], f[i-1][j-1]+1)   假设有两个字符串a[0...i...m], b[0...j...n],f[i][j]表示a[0...i]和b[0...j] 的最长公共子序列的长度。

f[i][j]的值决定于3种情况:

1)a[i] == a[j] 则说明可以在f[i-1][j-1]的基础上拓展出一个公共的字符,即f[i][j] = f[i-1][j-1] + 1

2)a[i] != a[j] 则说明此时,a[0...i]和b[0...j]的最长公共子序列中绝对不可能同时包含a[i]和b[j]。则a[0...i]和b[0...j]的最长公共子序列可能以a[i]结尾,也可能以b[j]结尾,还可能结尾不包含a[i]或b[j]

这三种情况,其实对应的是:

可能以a[i]结尾:f[i][j-1]

可能以b[j]结尾:f[i-1][j]

可能结尾不包含a[i]或b[j]:f[i-1][j-1]    

现在我们要求的是这三种情况的最大值:f[i][j] = max(f[i][j-1], f[i-1][j], f[i-1][j-1])

(注:第三种情况的值必然小等于前面两种情况的值,因为在计算f[i][j-1]和f[i-1][j]时,已经考虑过f[i-1][j-1]而选的最大值,所以f[i-1][j-1]必然不会大于前两种值!可以不用比较)

所以可以简化成:f[i][j] = max(f[i][j-1], f[i-1][j])


最后写成的代码是:http://blog.csdn.net/fightforyourdream/article/details/20015641



LIS:f[i]=max(f[j]+1, a[i]>=a[j]) 分析最后一次划分,最后一次字符/最后一个。。


3 初始化 // f[i][0] f[0][i] 
// f[0]
// lis: f[1..N] = 1


4 答案是什么 // LIS: max{f[i]}
// LCS: f[n][m]


5 Loop怎么写 
// interval: 区间从小到大,先枚举区间长度,palindrome partitioning II






初始化


matrix DP


sequence DP 
LIS




for(i=0; i<n; i++){
for(j=0; j<i; j++)  位置或长度
if(a[i]>a[j]){
f[i] = max(f[i], f[j]+1)
}
}






开始多开一位,把0位空出来




2 sequence DP
LCS Edit distance


dist[i][j]代表word1的前i个字符 匹配上 word2的前j个字符 的最XXX


LCS




interleave[i][j]代表s1的前i个字符,和s2的前j个字符,是否能匹配s3的前i+j字符


打擂台












原文链接 : http://blog.csdn.net/fightforyourdream/article/details/19755859
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值