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;
}

  

posted @ 2015-03-23 19:29  Running_Time  阅读(173)  评论(0编辑  收藏  举报