1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 |
#include <stdio.h> #include <string.h> int b[50][50]; int c[50][50]; int length = 0; void
lcs( char
*x, int
m, char
*y, int
n) { int
i; int
j; for (i = 1; i <= m; i++) c[i][0] = 0; for (i = 1; i <= n; i++) c[0][i] = 0; for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if (x[i-1] == y[j-1]) { c[i][j] = c[i-1][j-1] + 1; b[i][j] = 1; } else
if (c[i-1][j] > c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 2; } else { c[i][j] = c[i][j-1]; b[i][j] = 3; } } } } void
show( int
i, int
j, char
*x) { if (i == 0 || j ==0) return ; if (b[i][j] == 1) { show(i-1, j-1, x); length++; printf ( "%c" , x[i-1]); } else
if (b[i][j] == 2) { show(i-1, j, x); } else { show(i, j-1, x); } } int
main() { char
*x = "xyzrfdt" ; char
*y = "xzhrgfiut" ; //xzrft int
m = strlen (x); int
n = strlen (y); lcs(x,m,y,n); printf ( "The string is: \n" ); show(m, n, x); } |
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int main(int argc, char **argv) 5 { 6 string str1 = "ABCBDAB"; 7 string str2 = "BDCABA"; 8 9 int x_len = str1.length(); 10 int y_len = str2.length(); 11 12 int arr[50][50] = {{0,0}}; 13 14 int i = 0; 15 int j = 0; 16 17 for(i = 1; i <= x_len; i++) 18 { 19 for(j = 1; j <= y_len; j++) 20 { 21 if(str1[i - 1] == str2[j - 1]) 22 { 23 arr[i][j] = arr[i - 1][j - 1] + 1; 24 } 25 else 26 { 27 28 if(arr[i][j - 1] >= arr[i - 1][j]) 29 { 30 arr[i][j] = arr[i][j - 1]; 31 } 32 else 33 { 34 arr[i][j] = arr[i -1][j]; 35 } 36 } 37 38 } 39 } 40 for(i = 0 ; i <= x_len; i++) 41 { 42 for( j = 0; j <= y_len; j++) 43 { 44 cout << arr[i][j] << " "; 45 } 46 cout << endl; 47 } 48 for(i = x_len, j = y_len; i >= 1 && j >= 1;) 49 { 50 if(str1[i - 1] == str2[j - 1]) 51 { 52 cout << str1[i - 1] << " ";//倒序打印的 53 i--; 54 j--; 55 } 56 else 57 { 58 // if(arr[i][j -1] >= arr[i - 1][j])//打印:B A D B 59 if(arr[i][j -1] > arr[i - 1][j]) //打印:A B C B 60 { 61 j--; 62 } 63 else 64 { 65 i--; 66 } 67 } 68 } 69 cout << endl; 70 return 0; 71 }
运行结果:
动态规划之LCS(最大公共子序列),布布扣,bubuko.com
原文:http://www.cnblogs.com/CoolRandy/p/3648977.html