通常动态规划以自底向上的方式来利用最优子结构,而备忘录方法采取自顶向下的策略
#include<iostream>
using namespace std;
#define lengthx 29
#define lengthy 28
int LOOKUP_CHAIN(char *x,char *y,int i,int j);
int c[lengthx+1][lengthy+1];
int memorized_LCS_LENGTH(char *X,char *Y){
int m= lengthx;
int n=lengthy;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
c[i][j]=-1;
return LOOKUP_CHAIN(X,Y,m,n);
}
int LOOKUP_CHAIN(char *x,char *y,int i,int j){
if(c[i][j]>-1)
return c[i][j];
if(i==0||j==0)
c[i][j]=0;
else{
if(x[i-1]==y[j-1])
c[i][j]=LOOKUP_CHAIN(x,y,i-1,j-1)+1;
else
c[i][j]=max(LOOKUP_CHAIN(x,y,i,j-1),LOOKUP_CHAIN(x,y,i-1,j));
}
return c[i][j];
}
int main(){
char *s1="ACCGGTCGAGTGCGCGGAAGCCGGCCGAA";
char *s2="GTCGTTCGGAATGCCGTTGCTCTGTAAA";
cout<<memorized_LCS_LENGTH(s1,s2)<<endl;
return 0;
}