LCS 路徑還原

2021-08-05 21:49:43 字數 1031 閱讀 5074

51nod動態規劃教程

最後,我們來提供輸入輸出資料,由你來寫一段程式,實現這個演算法,只有寫出了正確的程式,才能繼續後面的課程。

輸入第1行:字串a

第2行:字串b

(a,b的長度 <= 1000)

輸出輸出最長的子串行,如果有多個,隨意輸出1個。

輸入示例

abcicba

abdkscab

輸出示例

思路:

剛開始按照lis的nlgn解法思路記錄路徑,發現錯多了。lcs更新的方式就是分兩種情況(兩個字元相等和不相等)和三個方向(左,上,左上)取最大值,dp[i + 1][j + 1]表示的是在a串前i位和b串前j位的lcs(可能不止乙個序列,但最大值唯一),由於序列不唯一,路徑還原就需要找dp增加的時候來自的兩種情況。字元相等的情況才是真正的路徑,不相等時只是為了更新這個dp值(為下乙個相等時做準備),這樣問題就easy了,用二維陣列記錄dp值增加來自的三個方向,開始逆著搜尋,當出現字元相等的情況輸出這個字元;

#include 

#include

#include

#include

#define max_n 1010

using

namespace

std;

int dp[max_n][max_n], pre[max_n][max_n];

char a[max_n], b[max_n], c[max_n];

void dfs(int x, int y)

else

if(pre[x][y] == 2)

else dfs(x, y - 1);

}int main()

else

else }}

}dfs(len1, len2);

return

0;}

最短路徑路徑還原

include include include include include using namespace std struct edge const int max e 10000 最大邊數 const int max v 10000 最大頂點數 const int inf 10000 最大距...

弗洛伊德演算法 路徑還原

用dp來解決,在只使用頂點0 k和i,j的情況下 i,j作為起點和重點,0 k個點作為中間點 記i到j的最短長度為dp k i j k 1表示只是用i和j兩個點,此時dp 0 i j cost i j 接下來,我們分i到j的最短路恰好經過k和不經過k兩種,如果不經過k點 那麼就是dp k 1 i j...

最短路 路徑還原(dijkstra,模板)

b.wzy的大冒險 出發咯qaq 單點時限 2.0 sec 記憶體限制 512 mb 第一行兩個數n,m 1 n 103,1 m 103 接下來m行,每行三個數x,y,z,表示點 x 與點 y 之間有一條權值為 z 的有向邊 1 x,y,z 103 第一行乙個整數表示 1 到 n 的最短距離 第二行...