求最长公共子序列 递推
void solve() {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (s1[i] == s2[j]) {
dp[i + 1][j + 1] = dp[i][j] + 1;
}
else {
dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
}
}
}
}
nyoj 36 最长公共子序列 http://acm.nyist.net/JudgeOnline/problem.php?pid=36&rec=rec
#include <cstdio>
#include <iostream>
#include <algorithm>
#include<string.h>
using namespace std;
int n,m;
char s1[1010];
char s2[1010];
int dp[1010][1010];
void solve() {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (s1[i] == s2[j]) {
dp[i + 1][j + 1] = dp[i][j] + 1;
}
else {
dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1,s2);
n = strlen(s1);
m = strlen(s2);
solve();
printf("%d\n",dp[n][m]);
}
return 0;
}