dp 最長公共子串行

2021-07-11 15:03:55 字數 1434 閱讀 1243

題目:

給兩個字串, str1, str2;

列印出最長公共子串行;

如: abbbbv

vbbbba

答案是:

bbbb(答案不唯一)

理解:以前學過一下,寫的出來那種算長度的題目;

但這種求最終序列的題確實沒做過;

然後就很傻的開了乙個10的9次方的空間來做,發現直接爆了;

最後看了解題過程才過的;

最長公共子串行:

根據推測可知:

如果str1[i] != str2[j];

則:當前長度與前面求出的最大長度相等;

即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

如果相等;

則:當前長度為前乙個的長度加 1;

即:dp[i][j] = dp[i - 1][j - 1] + 1;

而在推導出 dp 陣列後會發現;

我們向前推回去就可以找到乙個字串;

這個字串便是結果中的一種;

那麼怎麼推回去呢?

在前面推導的基礎上,我們可以發現;

相等的時候是加了乙個 1;

則說明我們該在答案裡加入相應的值;

而不相等的時候,我們是取的最大值;

那麼,回退的時候我們就應該向值大的方向退;

**如下:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

const

double min_inf = 1e-7;

const

int max_inf = (1e9) + 7;

#define x first

#define y second

int main()

else }}

string ans = "";

for (int i = str1.length(), j = str2.length(); i >= 1 && j >= 1;)

else

else }}

reverse(ans.begin(), ans.end());

cout

<< ans << endl;

return

0;}

DP 最長公共子串行

解題報告 題目 演算法 dp 最長公共子串行 思路 最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個數列 s 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。d i j 表示s1的第i位...

最長公共子串行 DP

有序子串行定義 若x 則它的子串行為y 即原序列調出若干項組成的序列且下標要求有序。lcs 最長公共子串行 定義 給定兩個序列x 和y 存在乙個嚴格遞增的x的下標序列為,對所有的j 1,2,3.k,滿足xi yj,例如x 1 4 3 2 5 y 4 3 5 7 則x和y的最長公共子串行為 4 3 5...

最長公共子串行 DP

最長公共子串行 lcs.pas c cpp 問題描述 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x x1,x2,xm 則另一串行z z1,z2,zk 是x的子串行是指存在乙個嚴格遞增的下標序列 i1,i2,ik 使得對於所有j 1,2,k有 xij zj 例如,序...