题意:
求两个字符串(可能有空格)的最长公共子序列长度。
思路:
经典的动态规划问题。
设定字符串a和b都是下标从1开始。定义dp[i][j]表示字符串a前i个字符与字符串b前j个字符的最长公共子序列长度,那么状态转移方程为
dp[i][j] = 0 : if i == 0 || j == 0;
dp[i][j] = dp[i - 1][j - 1] + 1 : if a[i] == b[j];
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) : if a[i] != b[j];
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1005;
int dp[N][N];
char a[N];
char b[N];
int main() {
while(gets(a + 1)) {
gets(b + 1);
int la = 1 + strlen(a + 1);
int lb = 1 + strlen(b + 1);
for (int i = 1; i < la; ++i) {
for (int j = 1; j < lb; ++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]);
}
}
}
printf("%d\n", dp[la - 1][lb - 1]);
}
return 0;
}