top1编程
← 返回题目
题解

【基础】最长公共子序列(LCS)(1)

1 条题解

  • 0
    @ 2026-7-29 0:17:38
    #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