文章

150

粉丝

0

获赞

558

访问

23.3k

头像
最长公共子序列 题解:
P1731 上海交通大学/中国矿业大学机试题
发布于2026年2月12日 17:25
阅读数 165

#include<bits/stdc++.h>
using namespace std;

// dp[i][j] 表示:字符串a的前i个字符 和 字符串b的前j个字符
// 的最长公共子序列长度
int dp[1005][1005];
int main(){
	string a, b;           // 两个输入字符串	
	// 初始化dp数组为0
	// dp[0][j] 和 dp[i][0] 表示空字符串的LCS,都是0
	memset(dp, 0, sizeof(dp));	
	while(cin >> a >> b){
		int la = a.size();     // 字符串a的长度
		int lb = b.size();     // 字符串b的长度	
		// 动态规划填表
		// i从1开始,对应a的第i个字符(即a[i-1])
		for(int i = 1; i <= la; ++i){
			for(int j = 1; j <= lb; ++j){
				// 情况1:当前字符相同
				// a[i-1] == b[j-1],说明可以延长LCS
				if(a[i-1] == b[j-1])
					dp[i][j] = dp[i-1][j-1] + 1;  // 继承之前的LCS长度,再+1
				// 情况2:当前字符不同
				// 只能取两种情况的最大值:
				// - 不用a[i-1]:dp[i-1][j]
				// - 不用b[j-1]:dp[i][j-1]
				else
					dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
			}
		}		
		// 答案:两个完整字符串的LCS长度
		cout << dp[la][lb] << endl;	
	}	
	return 0;
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发