文章

150

粉丝

0

获赞

522

访问

22.2k

头像
Coincidence 题解:
P1293 上海交通大学机试题
发布于2026年2月12日 17:22
阅读数 200

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

// dp[i][j] 表示:字符串a的前i个字符 和 字符串b的前j个字符
// 的最长公共子序列长度
int dp[105][105];
int main(){
	string a, b;           // 两个输入字符串	
	// 初始化dp数组为0
	// dp[0][j] 和 dp[i][0] 表示空字符串的LCS,都是0
	memset(dp, 0, sizeof(dp));	
	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;
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发