题意:输出两字符串的最长公共子序列长度
分析:LCS(Longest Common Subsequence)裸题。状态转移方程:dp[i+1][j+1] = dp[i][j] + 1; (s[i] == t[i])dp[i+1][j+1] = max (dp[i][j+1], dp[i+1][j]); (s[i] != t[i])
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std; const int MAXN = 3e2 + 10;
const int INF = 0x3f3f3f3f; char s[MAXN];
char t[MAXN];
int dp[MAXN][MAXN]; void LCS(int len1, int len2)
{
for (int i=0; i<len1; ++i)
{
for (int j=0; j<len2; ++j)
{
if (s[i] == t[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(void) //POJ 1458 Common Subsequence
{
#ifndef ONLINE_JUDGE
freopen ("LCS.in", "r", stdin);
#endif while (~scanf ("%s%s", &s, &t))
{
memset (dp, 0, sizeof (dp));
int len1 = strlen (s);
int len2 = strlen (t); LCS (len1, len2);
printf ("%d\n", dp[len1][len2]);
} return 0;
}