一本通 1265:【例9.9】最长公共子序列

动规模板 最长公共子序列

上代码:

//最长公共子序列 LCS
#include <iostream>
#include <cstring>

using namespace std;

const int N = 1005;

int n, m, dp[N][N];
char a[N], b[N];

int main() {
	cin >> a + 1 >> b + 1; //从1开始输入
	n = strlen(a + 1), m = strlen(b + 1);
	/*
	状态设置
		dp[i][j] : a[1 ~ i] 与 b[1 ~ j] 能得到的最长公共子序列的长度

	状态转移
		dp[i][j]
			if (a[i] == b[j])
				dp[i][j] = dp[i-1][j-1] + 1;
			else
				dp[i][j] = max(dp[i-1][j], dp[i][j-1]);

	初始化
		dp[i][0] = dp[0][i] = 0

	递推顺序
		i : 1 ~ n
			j : 1 ~ m

	输出
		cout << dp[n][m];
	*/
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			if (a[i] == b[j])
				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][m];
	return 0;
}

原题链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

 

代码可以拿走,把赞留下吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值