Description
给定两个字符串,请输出这两个字符串的最大公共子序列
输入格式
两行,一行一个字符串(不包括空格,Tab键),长度不超过1000
输出格式
输出最大公共子序列的长度
输入样例
abbca
aba
输出样例
3
/*
状态转移方程
当字母相同时,即a[i] == b[j]时, dp[i][j] = dp[i-1][j-1] + 1;当前位置的dp值为左上方dp值+1
字母不相同时, dp[i][j] = dp[i-1][j] > dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];//当前位置dp值为(上方的dp值)和(相邻左边dp值)中的较大值
这个状态转移方程这么写的目的是统一第0行和非0行、第0列非0列位置的dp值的计算,可以尝试填表发现特点
推荐书籍:《算法图解》
*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int dp[1005][1005] = {0};
int main()
{
char a[1005] = "", b[1005] = "";
cin>>a+1>>b+1;
int len_a = strlen(a+1), len_b = strlen(b+1);
int i, j;
for (i = 1; i <= len_a; i++)
for(j = 1; j <= len_b; j++)
if (a[i] == b[j])//如果两个字母相等
dp[i][j] = dp[i-1][j-1] + 1;
else//如果两个字母不相等
dp[i][j] = dp[i-1][j] > dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
printf("%d\n",dp[len_a][len_b]);
return 0;
}