• LCS 最长公共子序列


    与Edit Distance问题类似, 纯dp

    状态转移方程如下

    在poj上找了一道题目 poj1458, 水过

    代码如下

     1 #include <iostream>
     2 #include <string>
     3 #include <cstring>
     4 #include <cmath> 
     5 #include <cstdlib> 
     6 #include <map> 
     7 #include <algorithm> 
     8 #include <vector> 
     9 #include <stack>
    10 #include <queue>
    11 #include <set>
    12 #include <iomanip>
    13 #include <stdio.h>
    14 
    15 using namespace std;
    16 #define MAX 1000
    17 int **dp;
    18 
    19 void init()
    20 {
    21     dp = new int*[MAX];
    22     for(int i = 0; i < MAX; i ++)
    23     {
    24         dp[i] = new int[MAX];
    25     }
    26 }
    27 
    28 void reset()
    29 {
    30     for(int i = 0; i < MAX; i ++)
    31     {
    32         memset(dp[i], 0, MAX * sizeof(int));
    33     }
    34 }
    35 
    36 int LCS(string s1, string s2)
    37 {
    38     reset();
    39 
    40     for(int i = 1; i <= s1.length(); i ++)
    41     {
    42         for(int j = 1; j <= s2.length(); j ++)
    43         {
    44             if(s1[i - 1] == s2[j - 1])
    45                 dp[i][j] = dp[i - 1][j - 1] + 1;
    46             else
    47                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
    48         }
    49     }
    50     return dp[s1.length()][s2.length()];
    51 }
    52 
    53 int main(int argc, char *argv[])
    54 {
    55     init();
    56     string s1, s2;
    57     while(cin >> s1 >> s2)
    58     {
    59         cout<<LCS(s1, s2)<<endl;
    60     }
    61     return 0;
    62 }
    View Code

    时间复杂度O(M*N)

    空间复杂度O(M*N), 如果不需要回溯出具体子序列的结果, 可以压缩至线性

  • 相关阅读:
    打印日志宏定义
    数据库读写操作
    SQL语句组成
    MySQL数据库的使用
    ubuntu下解决MySQL 1045 error
    css样式优先级
    redis
    dubbo
    maven
    Mybatis笔记
  • 原文地址:https://www.cnblogs.com/stevenczp/p/3929136.html
Copyright © 2020-2023  润新知