动态规划
最长公共子序列(递归+备忘录)
#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;
}