1. 程式人生 > >最長公共子序列LCS (DP)

最長公共子序列LCS (DP)

mem main amp code bcd max std pan ems

題意

求兩個字符串的公共子序列,如“abcd” 與 “becd”的公共子序列是 “bcd”

分析:

設兩個字符串為 串s 和串t
dp[i][j]:= s1..si和t1...tj對應的LCS長度

那麽 dp[i][j] = {

0 ,       i =0 or j = 0;

dp[i-1][j-1] + 1,       i ,j > 0 and si = tj;

max(dp[i-1][j] , dp[i][j-1]), i, j > 0 and si != tj;

#include<bits/stdc++.h>
int N,C;
int w[1010],v[1010]; int dp[1010][1010]; int main() { //freopen("1.txt","r",stdin); int t; scanf("%d", &t); while(t--) { char a[1003],b[1003]; scanf("%s %s",a,b); memset(dp,0,sizeof(dp)); int aa = strlen(a); int bb = strlen(b); for(int i = 1; i <= aa;i++)
for(int j = 1; j <= bb;j++) { if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]+1; else { dp[i][j] = std::max(dp[i-1][j],dp[i][j-1]); } } // 打印DP表 for(int i = 0; i <= aa;i++) {
for(int j = 0; j <= bb;j++) { printf("%d ", dp[i][j]); } printf("\n"); } printf("%d\n",dp[aa][bb]); } }

  

最長公共子序列LCS (DP)