对于动态规划类的题目,首先需要寻找最优子结构的性质。
然后需要寻找子问题的递归结构
最后就是进行运算,代码如下
public int lcsLength(char []x,char []y,int b[][]){
int m=x.length-1;
int n=y.length-1;
int dp[][]=new int[m+1][n+1];
for (int i = 1; i <= m; i++) {
dp[i][0]=0;
}
for (int i = 1; i <= n; i++) {
dp[0][i]=0;
}
for (int i = 1; i <=m ; i++) {
for (int j = 1; j <=n ; j++) {
if(x[i]==y[j]){
dp[i][j]=dp[i-1][j-1]+1;
b[i][j]=1;
}
else if(dp[i-1][j]>dp[i][j-1]){
dp[i][j]=dp[i-1][j];
b[i][j]=2;
}
else{
dp[i][j]=dp[i][j-1];
b[i][j]=3;
}
}
}
return dp[m][n];
}
以上只能求最长子序列的长度,并不能进行输出。输出需要利用到我们的二维数组b。
public void lcsPrint(char []x,int i,int j,int b[][]){
if(i==-1||j==-1)return;
if(b[i][j]==1){
lcsPrint(x,i-1,j-1,b);
System.out.print(x[i]+" ");
}
else if(b[i][j]==2){
lcsPrint(x,i-1,j,b);
}
else{
lcsPrint(x,i,j-1,b);
}
}