码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划解最长公共子序列问题

时间:2014-09-22 18:07:52      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   for   div   sp   art   

http://blog.csdn.net/yysdsyl/article/details/4226630

 1 public class Main {
 2 
 3     /**
 4      * longest common subsequence
 5      * @param args
 6      */
 7     public static void main(String[] args) {
 8         
 9         char[] x = {‘A‘,‘B‘,‘C‘,‘B‘,‘D‘,‘A‘,‘B‘};
10         char[] y = {‘B‘,‘D‘,‘C‘,‘A‘,‘B‘,‘A‘};
11         
12         int[][] c = new int[x.length+1][y.length+1];
13         int[][] b = new int[x.length+1][y.length+1];
14         
15         getLCS(c, b, x, y);
16         printLCS(b, x, x.length, y.length);
17     }
18     /**
19      * 
20      * @param c 记录x[i]与y[j] 的LCS的长度
21      * @param b 记录匹配的路线
22      * @param x
23      * @param y
24      */
25     public static void getLCS(int[][] c, int[][] b,char[] x, char[] y){
26         
27         int i, j;
28         
29         int m = x.length;//c数组有m+1行
30         int n = y.length;//c数组有n+1列
31         
32         for(i = 0; i <= m; i++){
33             c[i][0] = 0;
34         }
35         for(i = 0; i <= n; i++){
36             c[0][i] = 0;
37         }
38         
39         for(i = 1; i <= m; i++){
40             
41             for(j = 1; j <= n; j++){
42                 
43                 /* 如果x[i-1]的字符与y[j-1]的字符相等 */
44                 if(x[i-1] == y[j-1]){
45                     
46                     /* 长度加1 */
47                     c[i][j] = c[i-1][j-1] + 1;
48                     
49                     /* 匹配成功方向为斜向下 */
50                     b[i][j] = 0;
51                 }
52                 /* x[i-1]的字符与y[j-1]的字符不相等 */
53                 else if(c[i-1][j] >= c[i][j-1]) //来自   上面  的匹配结果大于  左面  的匹配结果
54                 {
55                     c[i][j] = c[i-1][j];
56                     /* 方向为向下 */
57                     b[i][j] = 1;
58                 }
59                 else
60                 {
61                     c[i][j] = c[i][j-1];
62                     /* 方向向左 */
63                     b[i][j] = -1;
64                 }
65             }
66             
67         }
68     }
69     /**
70      * 回溯法 打印匹配的字符
71      * @param b
72      * @param x
73      * @param i
74      * @param j
75      */
76     public static void printLCS(int[][] b, char[] x, int i, int j){
77         if(i == 0 || j == 0)
78             return;
79         
80         /* 匹配成功的位置 */
81         if(b[i][j] == 0)
82         {
83             printLCS(b, x, i-1, j-1);
84             System.out.print(x[i-1] + " ");
85         }
86         else if(b[i][j] == 1)//匹配时的方向是向下,回溯时方向向上
87             printLCS(b, x, i-1, j);
88         else
89             printLCS(b, x, i, j-1);
90     }
91 }

 

动态规划解最长公共子序列问题

标签:style   blog   http   color   ar   for   div   sp   art   

原文地址:http://www.cnblogs.com/wanghui390/p/3986150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!