动态规划-最长公共子序列的备忘录算法

LCS问题是常见的可利用动态规划算法进行解决的问题。这里利用备忘录算法对求解过的子问题进行备份存储,避免了相同子问题的重复求解。LCS问题子问题的递归关系式如下:

具体代码实现如下:

   1: static int LCS_Memo(int[][] c,char[] X,char[] Y,int i,int j)  
   2:     {  
   3:         if( (i == 0) || (j == 0) )  
   4:             c[i][j]=0;  
   5:         else if(X[i-1] == Y[j-1])  
   6:             c[i][j]=LCS_Memo(c,X,Y,i-1,j-1)+1;  
   7:         else  
   8:         {  
   9:             int p=LCS_Memo(c,X,Y,i-1,j);  
  10:             int q=LCS_Memo(c,X,Y,i,j-1);  
  11:             if(p >= q)  
  12:                 c[i][j]=p;  
  13:             else  
  14:                 c[i][j]=q;  
  15:         }            
  16:         return c[i][j];  
  17:     }  
  18:     
  19:     static int LCS_Length(int[][] c,char[] X,char[] Y)  
  20:     {  
  21:         int m=X.length;  
  22:         int n=Y.length;  
  23:         return LCS_Memo(c,X,Y,m,n);  
  24:     }  
  25:     
  26:     static void printC(int[][] c) {
  27:         // TODO Auto-generated method stub
  28:         for (int i = 1; i < c.length; i++) {
  29:             for (int j = 1; j < c.length; j++) {
  30:                 System.out.print(c[i][j] + "\t");
  31:             }
  32:             System.out.println();
  33:         }
  34:     }
  35:     /**
  36:      * @param args
  37:      */
  38:     public static void main(String[] args) {
  39:         // TODO Auto-generated method stub
  40:         String X = "BCDB";
  41:         String Y = "ABCBDAB";
  42:         char[] x = X.toCharArray();
  43:         char[] y = Y.toCharArray();
  44:         
  45:         int MAX = x.length>y.length?x.length+1:y.length+1;
  46:         int[][] c = new int[MAX][MAX];
  47:         System.out.println(LCS_Length(c,x,y));
  48:         printC(c);        
  49:     }

转载于:https://www.cnblogs.com/ttltry-air/archive/2012/07/30/2615621.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值