zoukankan      html  css  js  c++  java
  • 基于DP的LCS(最长公共子序列)问题

    最长公共子序列,即给出两个序列,给出最长的公共序列,例如:

    序列1 understand

    序列2 underground

    最长公共序列undernd,长度为7

    一般这类问题很适合使用动态规划,其动态规划描述如下:

    设序列1为s,序列2为t,则

    if s[i+1]==t[j+1] dp[i+1][j+1]=dp[i][j]+1

    else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])

     代码如下:

    #pragma once
    #include <string>
    
    using std::string;
    
    string LCS(string s, string t)
    {
        const int MAX_N = 100;
        int dp[MAX_N][MAX_N];
        string rec[MAX_N][MAX_N];
    
        for (int i = 0;i < s.size();++i)
        {
            for (int j = 0;j < t.size();++j)
            {
                dp[i][j] = 0;
                rec[i][j].clear();
            }
        }
        for (int i = 0;i < s.size();++i)
        {
            for (int j = 0;j < t.size();++j)
            {
                if (s[i] == t[j])
                {
                    dp[i + 1][j + 1] = dp[i][j] + 1;
                    rec[i + 1][j + 1] = rec[i][j] + s[i];
                }
                else
                {
                    if (dp[i][j + 1] > dp[i + 1][j])
                    {
                        dp[i + 1][j + 1] = dp[i][j + 1];
                        rec[i + 1][j + 1] = rec[i][j + 1];
                    }
                    else
                    {
                        dp[i + 1][j + 1] = dp[i + 1][j];
                        rec[i + 1][j + 1] = rec[i + 1][j];
                    }
                }
            }
        }
        return rec[s.size()][t.size()];
    }

    以上为backward approach(forward search),如果选择后溯,则需要记录何时存储数组,何时直接使用已有数据。

  • 相关阅读:
    POJ 基本算法(3)
    给定范围的素数筛选(POJ 2689)
    无向图、有向图的最小环
    第k短路和A*
    HDU 4302 Holedox Eating (set + iterator)
    笛卡尔树
    HDU 多校联合第一场
    HDU 多校联合第二场
    POJ 图算法(3)
    POJ 1038 Bugs Integrated, Inc. (状态dp)
  • 原文地址:https://www.cnblogs.com/cielosun/p/5660429.html
Copyright © 2011-2022 走看看