题解——51 nod 1006
题目类型LCS
求最大公共子序列
dp模板题
状态转移方程
if(X[i-1] == Y[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
}
我用的是二维数组,图就不画了
//ac代码 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int dp[1001][1001]; char X[1001]; char Y[1001]; int i, j; char lcs[1001] = {'\0'}; int main() { scanf("%s",X); getchar(); scanf("%s",Y); int xlen = strlen(X); int ylen = strlen(Y); for(i = 1; i <= xlen; ++i) { for(j = 1; j <= ylen; ++j) { if(X[i-1] == Y[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = max(dp[i][j-1],dp[i-1][j]); } } } i = xlen; j = ylen; int k = dp[i][j]; //dp打表 while(i && j) { if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1) { lcs[--k] = X[i-1]; i--,j--; } else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1]) i--; else j--; } //回溯取值 printf("%s\n",lcs); }

浙公网安备 33010602011771号