LCS的dp解法及其回溯操作的代码模板
纯粹就是留个模板,
不再叙述相应的实现原理了。
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2000;//兼容的最长字符串长度
char a[maxn],b[maxn];
int len1,len2;
string ans;
int dp[maxn][maxn];
int LCS(int x,int y){//dp核心函数
if(x<0 || y<0)return 0;
if(dp[x][y]!=-1)return dp[x][y];
dp[x][y] = (a[x]==b[y])? (1+LCS(x-1,y-1)) : max(LCS(x-1,y),LCS(x,y-1));
return dp[x][y];
}
int BackTrace(){//回溯核心函数
int x = len1 - 1;
int y = len2 - 1;
ans="";
while(x>=0 && y>=0){
if(a[x]==b[y]){
ans += a[x];
x--;y--;
}else{
if(dp[x-1][y] > dp[x][y-1])x--;
else y--;
}
}
//回溯后对字符串反转才是答案
reverse(ans.begin(),ans.end());
return 0;
}
//上面两个核心函数其实思维角度是一致的
int main(){
//初始化
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s %s",a,b);
len1 = strlen(a);
len2 = strlen(b);
memset(dp,-1,sizeof(dp));
//LCS检测
LCS(len1-1,len2-1);
//回溯
BackTrace();
//输出答案
cout<<ans<<endl;
return 0;
}
OK