价值:记录学习过程的思考,本身就是一场动态规划的前生,记忆化搜索。
线性DP:最长公共子序列,讨论右边界相同(上层+1)、不同( i 行满足或者 j 行满足)取max
线性DP,讨论右边界,每次对右边界的一个字符讨论,组合最优子结构
//对右边的一个字符进行讨论,如果相同==>加入最优解中
if(c1 == c2){
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
//不同进行分类讨论
//如果i行是最优解的一部分
//如果j行是最优的一部分
//取max==》满足最优解定义
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
public int longestCommonSubsequence(String text1, String text2) {
int n = text1.length();
int m = text2.length();
int[][] dp = new int[n+1][m+1];
for(int i = 1; i<=n;i++){
char c1 = text1.charAt(i-1);
for(int j = 1;j<=m;j++){
char c2 = text2.charAt(j-1);
//对右边的一个字符进行讨论,如果相同==》加入最有解中
if(c1 == c2){
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
//不同进行分类讨论
//如果i行是最优解的一部分
//如果j行是最优的一部分
//取max==》满足最优解定义
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[n][m];
}