当不匹配条件时根据题意
若是子序列 01背包这种问题就继承最优值 若是子串就不继承直接重新开始初始化
为什么在else分支中要取max(dp[i-1][j], dp[i][j-1])?
答:子序列问题的核心思想:即使当前字符不匹配,也要继承之前的最优解,从而保证全局最优。
举例分析:
1. 为何取 max(dp[i][j-1], dp[i-1][j])
?
deepseek:
-
左边
dp[i][j-1]
:表示当前已处理到text1
的前i
个字符和text2
的前j-1
个字符的最优解(忽略text2[j-1]
)。 -
上边
dp[i-1][j]
:表示当前已处理到text1
的前i-1
个字符和text2
的前j
个字符的最优解(忽略text1[i-1]
)。 -
取最大值:确保继承两条路径中更优的结果,保留全局最长公共子序列。
class Solution { static const int N=1e3+2; int dp[N][N]; public: int longestCommonSubsequence(string text1, string text2) { for(int i=1;i<=text1.size();i++) for(int j=1;j<=text2.size();j++) { if(text1[i-1]==text2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i][j-1],dp[i-1][j]); } } return dp[text1.size()][text2.size()]; } };