#include <iostream>
#include <string>
using namespace std;
#define NUM 100
int c[NUM][NUM];
int b[NUM][NUM];
char zimu[NUM];
void LCSLength (int m,int n,string X,string Y);
void LCS (int m,int n,string X);
int main(){
string X = "INTHEBEGINNING";
string Y = "ALLLTHETHINGSARELOST";
int lenX = (int)X.length();
int lenY = (int)Y.length();
LCSLength(lenX, lenY, X, Y);
printf("%d\n",c[lenX][lenY]);
LCS(lenX, lenY, X);
return 0;
}
void LCSLength (int m,int n,string X,string Y){
int i,j;
for(i = 0;i <= m;i++)
c[i][0] = 0;
b[i][0] = 0;
for(i = 0;i <= n;i++)
c[0][i] = 0;
b[i][0] = 0;
for(i = 0;i <= m-1;i++){
for(j = 0;j <= n-1;j++){
if(X[i] == Y[j]){
c[i+1][j+1] = c[i][j] + 1;
b[i+1][j+1] = 1;
}else if(c[i][j+1] >= c[i+1][j]){
c[i+1][j+1] = c[i][j+1];
b[i+1][j+1] = 2;
}else{
c[i+1][j+1] = c[i+1][j];
b[i+1][j+1] = 3;
}
}
}
}
void LCS (int m,int n,string X){
int i = m,j = n,x = 0;;
int flag = 0;
do{
if(b[i][j] == 1){
zimu[x] = X[i-1];
i--;
j--;
x++;
}else if(b[i][j] == 2){
i--;
}else if(b[i][j] == 3){
j--;
}
flag++;
}while(flag <= m);
for (x = (int)strlen(zimu); x >= 0; x--) {
printf("%c ",zimu[x]);
}
}
最长公共子序列的规则是2个字符串相同字符最 大的长度吧,我来测试一下。
你这是什么思路,从哪里看来的呢?看上去像是 DP 但是又不是 DP 的代码。你最好说说一下你的思路,要不然我们也无从下手呀。
你的思路有点乱,不是标准的动态规划的思路。
这是我写的最长公共子序列LCS和最长递增子序列LIS 的代码,使用了标准的动态规划思想以及代码,你可以参考一下。https://blog.csdn.net/qq_46523755/article/details/115276919
LCS可以使用二维数组或者滚动数组,还可以增加打印路径功能。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y