1. 程式人生 > >最長公共子序列(經典dp)

最長公共子序列(經典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,