【模板】最長公共子序列
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s1[1000],s2[1000]; int len1,len2,dp[1000][1000],mark[1000][1000];//如果資料太大,dp陣列可以考慮滾動陣列 void LCS() { int i,j; memset(dp,0,sizeof(dp)); for(i = 0;i<=len1;i++) mark[i][0] = 1; for(i = 0;i<=len2;i++) mark[0][i] = -1; for(i = 1; i<=len1; i++) { for(j = 1; j<=len2; j++) { if(s1[i-1]==s2[j-1]) { dp[i][j] = dp[i-1][j-1]+1; mark[i][j] = 0; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j] = dp[i-1][j]; mark[i][j] = 1; } else { dp[i][j] = dp[i][j-1]; mark[i][j] = -1; } } } } void PrintLCS(int i,int j) { if(!i && !j) return ; if(mark[i][j]==0)//公共的 { PrintLCS(i-1,j-1); printf("%c",s1[i-1]); } else if(mark[i][j]==1) { PrintLCS(i-1,j); printf("%c",s1[i-1]); } else { PrintLCS(i,j-1); printf("%c",s2[j-1]); } }
相關推薦
洛谷 P1439 【模板】最長公共子序列
clu () 休閑 一句話 中一 AD DC == c++ 神TM模板。。我本來想休閑一下寫點水題的。。。 開始做的時候直接敲了一個O(N2)的算法上去,編譯的時候才發現根本開不下。。 好了,談回這道題。 先不加證明的給出一種算法。 若有一組數據 2 4 2 5 1 3
luogu P1439 【模板】最長公共子序列
bsp 第一個 順序 它的 amp while ++ return scan 題目qwq (第一道藍題) 據說是用了hash的思想(?) 總之是先把第一個序列每個數出現的順序記下來(其實第一個序列的數字不用記), 然後第二個序列的每個數都對照它的順序,這樣只要得到一個升序的
P1439 【模板】最長公共子序列
題目描述 給出1-n的兩個排列P1和P2,求它們的最長公共子序列。 輸入輸出格式 輸入格式: 第一行是一個數n, 接下來兩行,每行為n個數,為自然數1-n的一個排列。 輸出格式: 一個數,即最長公共子序列的長度 輸入輸出樣例 輸入樣例#1: 複製 5 3 2 1 4 5 1 2 3 4 5
洛谷P1439 【模板】最長公共子序列
1-n ont range else 輸入輸出格式 pac algo mes 格式 題目描述 給出1-n的兩個排列P1和P2,求它們的最長公共子序列。 輸入輸出格式 輸入格式: 第一行是一個數n, 接下來兩行,每行為n個數,為自然數1-n的一個排列。 輸出格式:
【模板】最長公共子序列(LCS)。
ons 理解 思路 esp 自動 const () -- bing 看過好多人的博客,感覺要麽是太復雜要麽就是太不容易理解。 那就親自動手寫一個通俗易懂的。 先定義兩個數組,第一個數組為主,用第二個數組來匹配第一個,看能有多少可以對應上的。 所以,其實第一個數組的內容可以暫
【模板】最長公共子序列
#include <stdio.h> #include <string.h> #include <algorithm> using namespace
[題解]洛谷P1439 【模板】最長公共子序列
序列 printf %d span pac namespace int turn esp 原題 原題 思路 將第一個序列依次從左到右標號,然後映射到第二個序列中 因為第一個序列標號只上升的所以問題就轉化為序列2標號後的最長上升子序列 代碼 #include&
洛谷 P1439 【模板】最長公共子序列 題解
inf bubuko return https == span ++ 每一個 upper 題目傳送門 看起來是一道十分經典的LCS問題 很容易想到 n2 的一般算法:主題代碼如下: for (int i = 1; i <= n; i++) fo
【DP】最長公共子序列
amp 給定 scrip ros script print 最長 去掉 != Description 字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1”,序列Y
【mark】最長公共子序列(poj 1458+hdu 1159)
經典的問題,在各大部落格上有數不清的好帖子 下面為最常見的n^2演算法 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #inclu
【動態規劃】最長公共子序列問題
clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)
【例9.9】最長公共子序列
std 不存在 cst i++ 公共子串 ostream ont enter http 【例9.9】最長公共子序列 鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1265 時間限制: 1000 ms 內
【NOJ1041】【DP_動態規劃】最長公共子序列
1041.最長公共子序列 時限:1000ms 記憶體限制:200000K 總時限:3000ms 描述 一個給定序列的子序列是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列X=<x1, x2,…, xm>,則另一序列Z=<z1, z2,
【經典動態規劃問題】最長公共子序列LCS
目錄 題目 題目分析 狀態 邊界值討論 其他情況討論 程式碼實現 從題目出發分析如何用動態規劃求解最長公共子序列問題 題目 給定兩個字串A和B,返回兩個字串的最長公共子序列的長度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”1234
【動態規劃】最長公共子序列與最長公共子串
1. 問題描述 子串應該比較好理解,至於什麼是子序列,這裡給出一個例子:有兩個母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子序列。最長公共子序列(Longest Common Subsequence
【水:最長公共子序列】【HDU1159】【Common Subsequence】
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24919 Acc
HDU 1159 【DP之最長公共子序列】
類似於字典序比較的最長公共子序列, 只要找到狀態方程就比較好搞, 從角標1開始計算不會出錯,從0還是報錯了; 切防止對比溢位要在本來的基礎上+1計算; 言歸正傳: DP型別都是狀態方程很重要; 假設兩
HDU 1159 【基礎DP 最長公共子序列】
TAT,,,覺得自己不算太理解,但是居然可以憑著記憶做出來。。蠻拼的 #include <cstdio> #include <cstring> #include <iostream> #include <string> usi
【bzoj5161】最長上升子序列 狀壓dp+打表
-s 只需要 [] sca div limits pow 證明 AC 題目描述 現在有一個長度為n的隨機排列,求它的最長上升子序列長度的期望。 為了避免精度誤差,你只需要輸出答案模998244353的余數。 輸入 輸入只包含一個正整數n。N<=28 輸出
【bzoj3173】最長上升子序列
節點 return hup 位置 一個 ostream online %d pre Portal --> bzoj3173 Solution 感覺自己需要智力康復qwq 首先題目給的這個序列肯定是一個\(1-n\)的排列,並且插入的順序是從小到大 仔細思考