最長公共子串行 LCS

2021-08-16 05:54:53 字數 1654 閱讀 8388

hdu 1159 common subsequence (最長公共子串行 lcs)

題意不多說,就是最長公共子串行的模板題

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3fffffff

#define ll long long

const int n=1e3+1;

char a[n],b[n];

int dp[n][n];

int main()

printf("%d\n",dp[la][lb]);

}}

hdu 1503advanced fruits (最長公共子串行+遞迴輸出)

題意:給你兩串字串,將兩字串結合起來形成一串,公共子串行只出現一次,將這串串行輸出。

兩種方法,lcs方面沒什麼不一樣的關鍵是輸出字串,可以遞迴也可以非遞迴。這裡要用二維陣列標記一下,詳細看**

//非遞迴

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3fffffff

#define ll long long

const int n=110;

char a[n],b[n],s[n*2];

int dp[n][n];

int main()

else if(dp[i][j-1]>=dp[i-1][j]) s[k++]=b[j--];

else s[k++]=a[i--];

}//沒有公共子串行時直接將兩字串存到s陣列裡面

while(i!=0) s[k++]=a[i--];

while(j!=0) s[k++]=b[j--];

for(i=k-1;i>=0;i--)

printf("%c",s[i]);

printf("\n");

}}

//遞迴

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3fffffff

#define ll long long

const int n=101;

int la,lb,dp[n][n],vis[n][n];//vis陣列標記用於輸出

char a[n],b[n];

void lcs()

else if(dp[i][j-1]>=dp[i-1][j])

else if(dp[i][j-1]}

}}void out(int i,int j)

//有公共子串行時遞迴輸出

else if(vis[i][j]==1)

else if(vis[i][j]==2)

else if(vis[i][j]==3)

}int main()

}

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...

LCS最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...