动态规划
最长公共子序列(递归+备忘录)
#include<iostream>
#include<string.h>
#define N 100
using namespace std;
char A[N]="ABCBDAABCD";
char B[N]="BDCAB";
int memory[N][N];
int dp(int i,int j){
if(memory[i][j]!=0)
return memory[i][j];
if(i==0||j==0)//边界
return 0;
if(A[i]==B[j])//最后一个字符相同
memory[i][j]=dp(i-1,j-1)+1;
else
memory[i][j]=max(dp(i,j-1),dp(i-1,j));
return memory[i][j];
}
void print(int m,int n){
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++)
cout<<memory[i][j]<<"\t";
cout<<endl;
}
}
int main(){
int m=strlen(A);
int n=strlen(B);
cout<<dp(m,n)<<endl;
print(m,n);
return 0;
}

本文介绍了如何使用动态规划方法求解两个字符串的最长公共子序列。代码示例展示了递归结合备忘录的实现方式,通过填充二维数组`memory`来避免重复计算,提高效率。在C++中,程序计算了字符串`A`和`B`的最长公共子序列的长度,并输出了过程中的记忆数组。
3576

被折叠的 条评论
为什么被折叠?



