求两个字符串的最长公共子序列长度。
输入格式:
输入长度≤100的两个字符串。
输出格式:
输出两个字符串的最长公共子序列长度。
输入样例1:
ABCBDAB
BDCABA
输出样例1:
4
输入样例2:
ABACDEF
PGHIK
输出样例2:
0
动态规划问题 主要是处理好边界以及状态转移方程。
pat不可以用gets函数,就换成了fgets函数,主要是想一开始就处理好下标从1开始
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
const int N = 100;
using namespace std;
char A[N], B[N];
int dp[N][N];
int main()
{
fgets(A + 1, 100, stdin);
fgets(B + 1, 100, stdin);
int len1 = strlen(A + 1);
int len2 = strlen(B + 1);
//边界
for(int i = 0; i <= len1; i++)
{
dp[i][0] = 0;
}
for(int j = 0; j <= len2; j++)
{
dp[0][j] = 0;
}
//状态转移方程
for(int i = 1; i <= len1; i++)
{
for(int j = 1; j <= len2; 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[len1][len2];
cout << dp[len1-1][len2-1];
return 0;
}