题解
【基础】最长公共子序列(LCS)(1)
1 条题解
-
0
#include <bits/stdc++.h> using namespace std; //dp[i][j]用来存储子问题 a[1..i] 和 b[1..j] 的 LCS 长度 int n,dp[1001][1001],i,j,a[1001],b[1001]; int main() { cin>>n; for(i = 1;i <= n;i++) cin>>a[i]; for(i = 1;i <= n;i++) cin>>b[i]; /* 计算a序列取i个元素,b序列取j个元素下的最长公共子序列长度 */ // 动态规划填充 dp 表 for(i=1; i<=n; i++){ for(j=1; j<=n; j++){ if(a[i] == b[j]){ //匹配成功,LCS 长度 +1 //状态转移方程: dp[i][j] = dp[i-1][j-1] + 1; }else{ //取左侧或上方的最大值 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } cout<<dp[n][n];// 即为两个序列的最长公共子序列长度 return 0; }
- 1