動態規劃:公共子序列
現在給出兩個序列X和Y,你的任務是找到X和Y的最大公共子序列,也就是說要找到一個最長的序列Z,使得Z既是X的子序列也是Y的子序列。
輸入 輸入包括多組測試資料。每組資料包括一行,給出兩個長度不超過200的字串,表示兩個序列。兩個字串之間由若干個空格隔開。 輸出 對每組輸入資料,輸出一行,給出兩個序列的最大公共子序列的長度。 樣例輸入
abcfbc abfcab programming contest abcd mnp
4 2 0
思路如下:
建立二維陣列dp[i][j],表示第一個序列前i個字母與第二個序列前j個字母最大公共子序列的長度;
對於a[i]==b[i],dp[i][j]=dp[i-1][j-1]+1;
對於a[i]!=b[i],dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
程式碼如下:
#include<iostream> #include<cstring> using namespace std; int max(int a,int b) { if(a>=b) return a; else return b; } int main() { int i,j,m,n,dp[205][205]={0}; char a[205]={'\0'},b[205]={'\0'}; while(cin>>a>>b) { n=strlen(a); m=strlen(b); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } cout<<dp[n][m]<<endl; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); //因為是迴圈輸入,注意清零 } }
相關推薦
動態規劃:公共子序列
描述 我們稱序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列當且僅當存在 嚴格上升 的序列< i1, i2, ..., ik >,使得對j = 1, 2, ... ,k,
動態規劃公共子問題模式總結
動態規劃公共子問題模式 在解決動態規劃問題時候, 關鍵的一點就是找到子問題, 在動態規劃中有一些常見的子問題模式,需要熟悉。下面就是一些常見子問題模式總結 1. 輸入為x1,x2,···, xn輸出為x1,x2, ···, xi 在這種情況下,子問題是從x1~xi這一
動態規劃之子序列與子串問題分析
1、最大子序列 最大子序列是找出由陣列組成的一維陣列中和最大的連續子序列;O(n) Max = 0 ; sum = max{a[i]+sum , a[i] }; 2、最大升序子序列(LIS:longestincreasing sequence) 最大升序子序列是找出由
動態規劃——連續子序列最大和
題目描述: 輸入一個整型陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1,
[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列
每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。 將待求解問題分解成若幹個子問題,先求
動態規劃 最長公共子序列
一個 then mda 偽代碼 n-2 msu csdn static 證明 最長公共子序列(LCS)問題 下面通過一個具體的例子來學習動態規劃方法 —— 最長公共子序列問題。 最長公共子串(Longest Common Substring)與最
C++求解漢字字符串的最長公共子序列 動態規劃
esp style mes else if c++ char 那種 size 公共子序列 近期,我在網上看了一些動態規劃求字符串最長公共子序列的代碼。可是無一例外都是處理英文字符串,當處理漢字字符串時。常常會出現亂碼或者不對的情況。 我對代碼進行了改動。使用wc
【動態規劃】最長公共子序列問題
clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)
動態規劃之最長公共子序列(LCS)
int tdi -s can 數組下標 include har 遞推 最長公共子序列 在字符串S中按照其先後順序依次取出若幹個字符,並講它們排列成一個新的字符串,這個字符串就被稱為原字符串的子串 有兩個字符串S1和S2,求一個最長公共子串
動態規劃-最長公共子序列LCS
return str2 pat for 思路 規劃 得來 表示 || 0 問題 給定兩個字符串,求最長公共子序列LCS。 也就是說兩個字符串中都有的部分,或者理解為,兩個字符串同時都刪除字符串中的某些字符,使得最終的兩個字符串,相等,且是最長的。 1 分析 假設兩個str1
動態規劃之最長公共子序列
圖片 輔助 length ret %s csp TP 子序列 輸出 原理請參考《算法導論》 定義常量 enum {upper_left, up, left}; #define LENGTHA (sizeof(A)/sizeof(A[0])) #define LENGTHB
動態規劃之----最長公共子序列
什麽是 資料 lcs 由於 main detail span www. 遞歸 一,問題描述 給定兩個字符串,求解這兩個字符串的最長公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 則這兩個字符串的最長
BZOJ2423 HAOI2010最長公共子序列(動態規劃)
out color tchar efi turn name 子序列 lld 動態 大討論。註意去重。 #include<iostream> #include<cstdio> #include<cmath> #include<
動態規劃-最長公共子序列
https://www.cnblogs.com/hapjin/p/5572483.html 一,問題描述 給定兩個字串,求解這兩個字串的最長公共子序列(Longest Common Sequence)。比如字串1:BDCABA;字串2:ABCBDAB 則這兩個字串的最長公共子序列長度為4
最長公共子序列(Java實現)——動態規劃
【問題描述】 給定2個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。 給定2個序列X={A,B,C,B,D}和Y={B,D,C,A,B},找出X和Y的最長公共子序列{B,C,B}。 【分析】最長公共子序列問題具有最優子結構性質 設 X = {
最長公共子序列問題動態規劃
最長公共子序列問題:若給定序列X={x1,x2,…,xm},則另一序列Z={z1,z2,…,zk},是X的子序列是指存在一個嚴格遞增下標序列{i1,i2,…,ik}使得對於所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相應的
動態規劃-最長公共子序列問題(LCS)
若給定序列X={x1,x2,…,xm},則另一序列Z={z1,z2,…,zk} 是X的子序列 是指存在一個嚴格遞增下標序列{i1,i2,…,ik}使得對於所有j=1,2,…,k有:zj=xij。 例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相應的遞增下標
【NOJ1041】【DP_動態規劃】最長公共子序列
1041.最長公共子序列 時限:1000ms 記憶體限制:200000K 總時限:3000ms 描述 一個給定序列的子序列是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列X=<x1, x2,…, xm>,則另一序列Z=<z1, z2,
動態規劃:求最長公共子序列和最長公共子串
最長公共子序列(LCS): 這同樣是一道經典題目,定義就不說了。 為了方便說明,我們用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}。那麼,求長度分別為m,n的兩個序列X,Y的LCS就相當於求Xm與Yn的LCS。我們將其分割為區域性問題進行分析。 首先,求Xm與Yn的LCS要考慮一下兩
動態規劃實現最長公共子序列
1 public class Test2 { 2 3 static int[][] result; 4 static String str1 = "ABCBDAB"; 5 static String str2 = "BDCABA"; 6 static cha