LCS POJ 1458 Common Subsequence
题意:输出两字符串的最长公共子序列长度
分析: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; }
编译人生,运行世界!