首页 > 编程知识 正文

最大子串动态规划,动态规划01背包问题

时间:2023-05-05 13:01:01 阅读:136013 作者:739

最长公共子串定义是,一个数列z分别是已知数列的子串(子串并不一定是连续的列,而是从该列中除去了几个要素后的列),而且,如果在满足该条件的所有列中为最长,则z是最长公共子串LCS (longestccs ) 公共子串是指要求连续的子串,有些则不是,在此要注意区分。 以下是完整的实现代码。

#include iostream

using namespace std;

voidLCS_length(char*x,char *y,int **b,int m,int n ) ) ) ) ) ) ) ) ) ) ) ) ) ) 652

{

//c[i][j]表示x[i-1]、y[j-1]之前的公共子序列的长度,I表示x阵列的前进,j表示y阵列的前进

没有用c[i][j]表示x[i],因为y[j]之前的公共子序列的长度必须使用c[0][0]表示没有公共子序列,

//也就是说,由于c[0][0]总是0,所以c排列的最大下标为c[m 1][n 1]

int **c;

c=new int*[m 1];

for(intI=0; im 1; I )

c[i]=new int[n 1];

for(intI=0; im 1; I )

c[i][0]=0;

for(intI=0; 合1; I )

c[0][i]=0;

for(intI=1; i=m; I )

{

for(intj=1; j=n; j )

{

if(x[I-1]==y[j-1] ) /找到了通用的“字符”

{

c[i][j]=c[i-1][j-1] 1; //公共子序列的长度加1

b[i][j]=0; //制作辅助标识,表示x、y数组需要进一步“前进”才能达到当前长度

//即x[i-1],y[j-1]必须做出贡献

}

//当前字符不同,x序列下降一步(即c[i-1][j] )比y序列下降一步(即c[i][j-1] ) ) ) ) ) ) ) ) )。

//得到的公共子串的长度很长,隐含地意味着现在最长的公共子串可以不需要x[i-1]

ELSEif(c[I-1][j]=c[I][j-1] ) )

{

c[i][j]=c[i-1][j]; //当前最长的公共子序列可以不需要x[i-1]

b[i][j]=-1;

}

//与上面的分析相似

else

{

c[i][j]=c[i][j-1]; //当前最长的公共子序列可以不需要y[j-1]

b[i][j]=1;

}

}

}

for(intI=0; im 1; I )

{

delete c[i];

c[i]=NULL;

}

delete []c;

c=NULL;

}

//打印结果

voidprint_LCS(int**b,char *x,int i,int j ) ) ) ) ) ) ) ) ) ) ) ) ) )。

{

if(I==0||j==0)

返回;

if(b ) I ) j )==0) ) ) )。

{

print_LCS(b,x,i-1,j-1 );

coutx[i-1];

}

ELSEif(B ) I ) j )==-1 ) ) ) ) ) ) )。

print_LCS(b,x,i-1,j );

else

print_LCS(b,x,I,j-1 );

}

int_tmain(intargc,_TCHAR* argv[] () ) ) ) ) ) ) ) ) ) )。

{

char x[]='ADAB ';

char y[]='ADCA ';

intm=Strlen(x;

intn=Strlen(y;

int **b;

b=new int*[m 1];

for(intI=0; im 1; I )

b[i]=new int[n 1];

LCS_length(x,y,b,m,n );

print_LCS(b,x,m,n );

for(intI=0; im 1; I )

{

delete b[i];

b[i]=NULL;

}

删除[ ] b;

b=空;

返回0;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。