最長公共子序列(經典dp)
最長公共子序列
時間限制:3000 ms | 記憶體限制:65535 KB 難度:3- 描述
- 咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。
tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。- 輸入
- 第一行給出一個整數N(0<N<100)表示待測資料組數
接下來每組資料兩行,分別為待測的兩組字串。每個字串長度不大於1000. - 輸出
- 每組測試資料輸出一個整數,表示最長公共子序列長度。每組結果佔一行。
- 樣例輸入
-
2 asdf adfsd 123abc abc123abc
- 樣例輸出
-
3 6
-
#include <stdio.h> #include <string.h> char s1[1001],s2[1001]; int dp[1001][1001]; int max(int n,int m) { return n >= m ? n : m; } int main(void) { int n,i,j; scanf("%d",&n); while(n--) { scanf("%s%s",s1,s2); memset(dp,0,sizeof(dp)); int m = strlen(s1),n = strlen(s2); for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } printf("%d\n",dp[m][n]); } }
其實,這題的空間複雜度還是可以優化的,具體利用滾動陣列優化空間開銷。程式碼如下:
#include <stdio.h> #include <string.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) char s1[1001],s2[1001]; int dp[2][1001]; int main(int argc , const char *argv) { int ncase; scanf("%d",&ncase); while(ncase--) { scanf("%s%s",s1,s2); memset(dp,0,sizeof(dp)); int m = strlen(s1),n = strlen(s2); for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(s1[i-1] == s2[j-1]) { dp[i%2][j] = dp[(i-1)%2][j-1] + 1; } else { dp[i%2][j] = MAX(dp[(i-1)%2][j],dp[i%2][j-1]); } } } printf("%d\n",dp[m%2][n]); } return 0; }
相關推薦
最長公共子序列(經典dp)
最長公共子序列 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。 tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longe
最長公共子序列LCS (DP)
mem main amp code bcd max std pan ems 題意: 求兩個字符串的公共子序列,如“abcd” 與 “becd”的公共子序列是 “bcd” 分析: 設兩個字符串為 串s 和串tdp[i][j]:= s1..si和t1...tj對應的LCS長度
NYOJ 36 最長公共子序列 (還是dp)
memset nbsp inpu 3.3 style cpp output 連續 表示 這個好多算法書上都有,不僅限於《算法導論》 時間限制:3000 ms | 內存限制:65535 KB 難度:3 描寫敘述 咱們
51nod 1006 最長公共子序列Lcs(dp+string,無標記數組實現)
轉移 opened mes star 字符 tex src 表示 logs 1006 最長公共子序列Lcs 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關註 取消關註 給出兩個字符串A B,求A與B的最長公共子序
LCS求最長公共子序列(DP)
遞推 劃分 get ima 維護 () arr har static 動態規劃並不是一種算法,而是一種解決問題的思路。典型的動態規劃問題,如最長公共子序列(LCS),最長單調子序列(LIS)等。 動態規劃分為四個步驟: 1.判斷問題是否具有最優子結構 這裏以LCS為例,X=
最長公共子序列(dp)
比較 else pre turn 最長公共子序列 fin 規劃 字符 mem 求最長公共子序列,比較出兩個字符串的最長的序列。用動態規劃求解 1 #include <bits/stdc++.h> 2 #define N 10005 3 #define me
bzoj 2423: [HAOI2010]最長公共子序列【dp+計數】
class pri ace 滾動數組 spa == i++ int const 設f[i][j]為a序列前i個字符和b序列前j個字符的最長公共子序列,轉移很好說就是f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+(a[i]==b[j]
洛谷P1439 最長公共子序列 - hash - dp - 貪心
序列 lin include mat space ++ depth 二分查找 mes 因為是兩串排列,所以兩串值相同位置不同 那麽公共子序列要求的就是值相同,而“子序列”要求的是值的位置上升 那麽把ab串聯系起來,b和a相同的值,位置不同。 設\(fb_i\) 為值為bi的
NYOJ 036 最長公共子序列(dp )
描述 咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。 tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subseque
LuoguP1439 排列求最長公共子序列【DP+單調棧】
題目描述 給出1-n的兩個排列P1和P2,求它們的最長公共子序列。 輸入輸出格式 輸入格式: 第一行是一個數n, 接下來兩行,每行為n個數,為自然數1-n的一個排列。 輸出格式: 一個數,
常考的經典演算法--最長公共子序列(LCS)與最長公共子串(DP)
https://blog.csdn.net/qq_31881469/article/details/77892324 《1》最長公共子序列(LCS)與最長公共子串(DP) http://blog.csdn.net/u012102306/article/details/53184446 h
hdu 1159 經典dp最長公共子序列
背景:上次比賽就沒有做出來,回來根據實際意義半天也想不出如何dp,結果從猜轉移方程入手,竟然想對了!開始想把空間優化到一維陣列,沒有想到要用同維度左邊的值wa了。 思路: dp[i][j]=max{m
【DP】最長公共子序列
amp 給定 scrip ros script print 最長 去掉 != Description 字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1”,序列Y
dp-最長公共子序列(LCS)
維數 追加 brush 解決 復雜 long long abcde urn 二維 字符序列 與 字符字串的區別 序列是可以不連續的字符串 , 字串必須要是連續的 。 問題描述 : 給定兩串字符串 abcde 和 acdf , 找出 2 串中相同的字符序列,觀
最長公共子序列 LCS 遞歸 dp 51Nod 1006
要求 hid using col mes turn tdi bbb clas 給出兩個字符串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為: abcicba abdkscab ab是兩個串的子序列,abc也是,abca也是,其中ab
51nod 1183 編輯距離【線性dp+類似最長公共子序列】
ima else ems 俄羅斯 hid ace mem std 類型 1183 編輯距離 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關註 編輯距離,又稱Levenshtein距離
POJ1458 Common Subsequence —— DP 最長公共子序列(LCS)
common vector tin enc one 技術分享 com iss char 題目鏈接:http://poj.org/problem?id=1458 Common Subsequence Time Limit: 1000MS Memory Limi
【bzoj2423】[HAOI2010]最長公共子序列 dp
代碼 ring ont 註意 return 需要 sam tdi light 題目描述 字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1&
bzoj3304[Shoi2005]帶限制的最長公共子序列 DP
str data- bsp ++ cpc printf define brush namespace 題意:給出三個序列,求出前兩個的公共子序列,且包含第三個序列,要求長度最長。 這道題目怎麽做呢,f[i][j]表示a串1-i,b串1-j的最長,g[i][j]表示a串i-n
newcoder 練習賽17 B 好位置 dp 最長公共子序列
abc i++ 包含 輸入 http light DC 同時 輸出 鏈接:https://www.nowcoder.com/acm/contest/109/B來源:牛客網 好位置 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,