zoukankan      html  css  js  c++  java
  • POJ 1458 最长公共子序列 LCS

    经典的最长公共子序列问题。

    状态转移方程为 : 

    if(x[i] == Y[j]) dp[i, j] = dp[i - 1, j - 1] +1
    else dp[i, j] = max(dp[i - 1], j, dp[i, j - 1]);
    

    设有字符串X和字符串Y,dp[i, j]表示的是X的前i个字符与Y的前j个字符的最长公共子序列长度。

    如果X[i] == Y[j] ,那么这个字符与之前的LCS 一定可以构成一个新的LCS;

    如果X[i] != Y[j] ,则分别考察 dp[i  -1][j], 和dp[i, j - 1],选择其中的较大者为LCS。

    Source code:

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define ll long long
    #define Max(a,b) (((a) > (b)) ? (a) : (b))
    #define Min(a,b) (((a) < (b)) ? (a) : (b))
    #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    
    using namespace std;
    
    const int INF  = 0x3f3f3f3f;
    const int MAXN = 500;
    
    int dp[MAXN][MAXN];
    
    int main(){
        int i, j, t, k, n, m;
        int len1, len2;
        string str1, str2;
        while(cin >> str1 >> str2){
            memset(dp, 0, sizeof(dp));
            len1 = str1.length();
            len2 = str2.length();
            for(i = 1; i <= len1; ++i){
                for(j = 1; j <= len2; ++j){
                    if(str1[i - 1] == str2[j - 1]){
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    }
                    else{
                        dp[i][j] = Max(dp[i - 1][j], dp[i][j - 1]);
                    }
                }
            }
            cout << dp[len1][len2] << endl;
        }
        return 0;
    }
  • 相关阅读:
    常见http代码错误原因及处理
    tar命令详解
    Laravel笔记
    ORM要用到的数组转对象和对象转数组函数
    模块
    内置函数
    正则
    sorted 、 filter 、 map
    匿名函数、冒泡排序,二分法, 递归
    python 函数部分
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4138596.html
Copyright © 2011-2022 走看看