参考算法笔记
1.什么是动态规划
2.最大连续子列和
计算一个序列A[]
状态转移方程
dp[i]=max{A[i], dp[i-1]+A[i]}
3.最长不下降子序列
LIS: Longest Increasing Sequence
问题:在一个数字序列中,找一个最长的子序列(可以不连续),
使得这个子序列是非下降的。
方案一
对于每个元素都有选和不选,时间复杂度是 O ( 2 n ) O(2^n) O(2n)
方案二
状态转移方程:
dp[i]=max{1, dp[j]+1}
(j=0,1,…,i-1 && A[j]<=A[i])
例题:PAT A1045,讲解
4.最长公共子序列(LCS)
Longest Commom Subsequence, LCS
暴力方法:
对两个字符串m, n,每个字符都有选和不选,然后在比较,总时间复杂度为 O ( 2 m + n ∗ m a x ( m , n ) ) O(2^{m+n} * max(m, n)) O(2m+n∗max(m,n))。
dp方法:
dp[ i ][ j ]代表字符A的i号位和字符B的j号位之前的LCS。
d p [ i ] [ j ] = { d p [ i − 1 ] [ j − 1 ] + 1 , A [ i ] = B [ i ] m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) , A [ i ] ! = B [ i ] dp[i][j]=\left\{ \begin{aligned} dp[i-1][j-1]+1, A[i] = B[i] \\ max(dp[i-1][j], dp[i][j-1]), A[i] != B[i] \end{aligned} \right. dp[i][j]={
dp[i−1]