r****m 发帖数: 70 | 1 有朋友提到不知道怎么做DP的题目,分享一下自己的总结,希望对大家有帮助。
1. Distinct Subsequence (String S, String T)
F(i, j) = F(i-1, j) , S[i] != T[j]
F(i-1, j) + F(i-1, j-1) , S[i] ==T[j]
2. Longest Common Subsequence (String S1, String S2)
F(i, j) = F(i-1, j-1) + 1, S[i] == T[j]
Max{ F(i-1, j), F(i, j-1) }, S[i] !=T[j]
LCS可以把空间复杂度O(n^2)减少到O(n),因为第n步的DP只 和前一步(第n-1步)的
最优子结果有关 F(n) = F(n-1)
3. Edit Distance (String S1, String S2)
F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) } , S1[i
] == S1[j]
Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i
] != S1[j]
注意: 动态规划初始化
for (int i = 0; i <= len1; i++) {
d[i][0] = i;
}
4. Unique path
F(i, j) = F(i-1, j) + F(i, j-1)
5. Longest Substring without Repeating Characters
F(i) = F(i-1) + 1, S[i] doesn't appear before
Min{ F(i-1) + 1, i - map.get(S[i]) }
6. Maximum sub-array
F(i) = F(i-1) + A[i], F(i-1) > 0
= A[i] , F(i-1) <= 0
7. Palindrome
F(j) = isPalindrome( i…j ) && F(i)
P(i, j) = P(i+1, j-1) from bottom left corner
8. Minimal coins
F(n) = Min{ F(n-a[i])} i = 0…m (m coins)
9. Regular expression
if(p[j] == '*')
d(i, j) = d(i, j-2) || d(i, j-1) | d(i-1, j)
10. Interleave string
a[i][j] = (a[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1))
|| (a[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)); | n*******e 发帖数: 4894 | 2 mark
【在 r****m 的大作中提到】 : 有朋友提到不知道怎么做DP的题目,分享一下自己的总结,希望对大家有帮助。 : 1. Distinct Subsequence (String S, String T) : F(i, j) = F(i-1, j) , S[i] != T[j] : F(i-1, j) + F(i-1, j-1) , S[i] ==T[j] : 2. Longest Common Subsequence (String S1, String S2) : F(i, j) = F(i-1, j-1) + 1, S[i] == T[j] : Max{ F(i-1, j), F(i, j-1) }, S[i] !=T[j] : LCS可以把空间复杂度O(n^2)减少到O(n),因为第n步的DP只 和前一步(第n-1步)的 : 最优子结果有关 F(n) = F(n-1) : 3. Edit Distance (String S1, String S2)
| l**o 发帖数: 356 | | H******7 发帖数: 1728 | | r*******e 发帖数: 971 | 5 总结得不错,不过第五个其实不算DP吧,更类似于贪心。 | r*******e 发帖数: 971 | 6 第三个
F(i, j) = F(i-1, j-1) , S1[i
] == S1[j]
F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i
] != S1[j]
就行了,不用 | t****o 发帖数: 33 | | a********e 发帖数: 53 | | t*****3 发帖数: 112 | 9 也想说这个,幸好看了回帖。还是赞一下楼主。
i
【在 r*******e 的大作中提到】 : 第三个 : F(i, j) = F(i-1, j-1) , S1[i : ] == S1[j] : F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i : ] != S1[j] : 就行了,不用
| j****3 发帖数: 129 | | | | r****m 发帖数: 70 | 11 有朋友提到不知道怎么做DP的题目,分享一下自己的总结,希望对大家有帮助。
1. Distinct Subsequence (String S, String T)
F(i, j) = F(i-1, j) , S[i] != T[j]
F(i-1, j) + F(i-1, j-1) , S[i] ==T[j]
2. Longest Common Subsequence (String S1, String S2)
F(i, j) = F(i-1, j-1) + 1, S[i] == T[j]
Max{ F(i-1, j), F(i, j-1) }, S[i] !=T[j]
LCS可以把空间复杂度O(n^2)减少到O(n),因为第n步的DP只 和前一步(第n-1步)的
最优子结果有关 F(n) = F(n-1)
3. Edit Distance (String S1, String S2)
F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) } , S1[i
] == S1[j]
Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i
] != S1[j]
注意: 动态规划初始化
for (int i = 0; i <= len1; i++) {
d[i][0] = i;
}
4. Unique path
F(i, j) = F(i-1, j) + F(i, j-1)
5. Longest Substring without Repeating Characters
F(i) = F(i-1) + 1, S[i] doesn't appear before
Min{ F(i-1) + 1, i - map.get(S[i]) }
6. Maximum sub-array
F(i) = F(i-1) + A[i], F(i-1) > 0
= A[i] , F(i-1) <= 0
7. Palindrome
F(j) = isPalindrome( i…j ) && F(i)
P(i, j) = P(i+1, j-1) from bottom left corner
8. Minimal coins
F(n) = Min{ F(n-a[i])} i = 0…m (m coins)
9. Regular expression
if(p[j] == '*')
d(i, j) = d(i, j-2) || d(i, j-1) | d(i-1, j)
10. Interleave string
a[i][j] = (a[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1))
|| (a[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)); | n*******e 发帖数: 4894 | 12 mark
【在 r****m 的大作中提到】 : 有朋友提到不知道怎么做DP的题目,分享一下自己的总结,希望对大家有帮助。 : 1. Distinct Subsequence (String S, String T) : F(i, j) = F(i-1, j) , S[i] != T[j] : F(i-1, j) + F(i-1, j-1) , S[i] ==T[j] : 2. Longest Common Subsequence (String S1, String S2) : F(i, j) = F(i-1, j-1) + 1, S[i] == T[j] : Max{ F(i-1, j), F(i, j-1) }, S[i] !=T[j] : LCS可以把空间复杂度O(n^2)减少到O(n),因为第n步的DP只 和前一步(第n-1步)的 : 最优子结果有关 F(n) = F(n-1) : 3. Edit Distance (String S1, String S2)
| l**o 发帖数: 356 | | H******7 发帖数: 1728 | | r*******e 发帖数: 971 | 15 总结得不错,不过第五个其实不算DP吧,更类似于贪心。 | r*******e 发帖数: 971 | 16 第三个
F(i, j) = F(i-1, j-1) , S1[i
] == S1[j]
F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i
] != S1[j]
就行了,不用 | t****o 发帖数: 33 | | a********e 发帖数: 53 | | t*****3 发帖数: 112 | 19 也想说这个,幸好看了回帖。还是赞一下楼主。
i
【在 r*******e 的大作中提到】 : 第三个 : F(i, j) = F(i-1, j-1) , S1[i : ] == S1[j] : F(i, j) = Min { F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) + 1 }, S1[i : ] != S1[j] : 就行了,不用
| j****3 发帖数: 129 | | | | n****2 发帖数: 307 | | g********r 发帖数: 89 | 22 mark
【在 r****m 的大作中提到】 : 有朋友提到不知道怎么做DP的题目,分享一下自己的总结,希望对大家有帮助。 : 1. Distinct Subsequence (String S, String T) : F(i, j) = F(i-1, j) , S[i] != T[j] : F(i-1, j) + F(i-1, j-1) , S[i] ==T[j] : 2. Longest Common Subsequence (String S1, String S2) : F(i, j) = F(i-1, j-1) + 1, S[i] == T[j] : Max{ F(i-1, j), F(i, j-1) }, S[i] !=T[j] : LCS可以把空间复杂度O(n^2)减少到O(n),因为第n步的DP只 和前一步(第n-1步)的 : 最优子结果有关 F(n) = F(n-1) : 3. Edit Distance (String S1, String S2)
| g****y 发帖数: 15 | |
|