程序碎片-LCS递归

求两个序列的最大子序列问题:

这个算法也是《算法导论》讲 dp 的例子,

讲的是有两个序列 Xn Ym ,假设 Zk 是他们的最大子列

可以证明:若 xn=ym ,则 xn 必然等于 zk easy

         xn =ym ,则 zk =xn 时, Z xn-1 ym 的最大子列

                    或者 zk =ym 时, Z xn ym-1 的最大子列

           (即:最后一个如果不在 z 的末尾,就可以移掉)

 

package zboDo;

 

public class LCS {

    char [] X ;

    char [] Y ;

    int [][] C ;

 

    public LCS() {

       String xSource = "ABCDBA" ;

       X = xSource.toCharArray();

       String ySource = "BDCABA" ;

       Y = ySource.toCharArray();

       C = new int [ X . length +1][ Y . length +1];

       for ( int i = 0; i <= X . length ; i++)

           for ( int j = 0; j <= Y . length ; j++) {

              if (i == 0 || j == 0) {

                  C [i][j] = 0;

              } else {

                  C [i][j] = Integer. MIN_VALUE ;

              }

           }

    }

 

    public void test() {

       int MaxLenght = getResult(6, 6);

       System. out .print(MaxLenght);

    }

 

    public int getResult( int xLen, int yLen) {

       if ( C [xLen][yLen] != Integer. MIN_VALUE ) {

           return C [xLen][yLen];

       }

       else if ( X [xLen-1] == Y [yLen-1]) {

           return getResult(xLen - 1, yLen - 1) + 1;

       }

       else

       {

           int maxWithoutLastX=getResult(xLen-1, yLen);

           int maxWithoutLastY=getResult(xLen, yLen-1);

           int longerOne=maxWithoutLastX>maxWithoutLastY?maxWithoutLastX:maxWithoutLastY;

           C [xLen][yLen]=longerOne;

           return longerOne;

       }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值