_xiaobai_

导航

zoj1027 Human Gene Functions(DP)

/*
 经典模型:最长公共子序列
*/

View Code
 1 #include <iostream>
2 #include <cstdlib>
3
4 using namespace std;
5
6 int Geno[ 210 ][ 210 ];
7 int Matr[ 5 ][ 5 ] = {
8 { 5,-1,-2,-1,-3},
9 {-1, 5,-3,-2,-4},
10 {-2,-3, 5,-2,-2},
11 {-1,-2,-2, 5,-1},
12 {-3,-4,-2,-1, 0}};
13
14 int V( char C )
15 {
16 switch( C ) {
17 case 'A': return 0;
18 case 'C': return 1;
19 case 'G': return 2;
20 case 'T': return 3;
21 case '-': return 4;
22 }
23 }
24
25 char A[ 110 ];
26 char B[ 110 ];
27
28 int main()
29 {
30 int t,n,m;
31 while ( cin >> t )
32 while ( t -- ) {
33 cin >> n >> A >> m >> B;
34
35 for ( int i = 0 ; i <= n ; ++ i )
36 for ( int j = 0 ; j <= m ; ++ j )
37 Geno[ i ][ j ] = -11111;
38
39 Geno[ 0 ][ 0 ] = 0;
40 for ( int i = 1 ; i <= n ; ++ i )
41 Geno[ i ][ 0 ] = Geno[ i-1 ][ 0 ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ];
42
43 for ( int j = 1 ; j <= m ; ++ j )
44 Geno[ 0 ][ j ] = Geno[ 0 ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ];
45
46 for ( int i = 1 ; i <= n ; ++ i )
47 for ( int j = 1 ; j <= m ; ++ j ) {
48 if ( Geno[ i-1 ][ j ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ] > Geno[ i ][ j ] )
49 Geno[ i ][ j ] = Geno[ i-1 ][ j ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ];
50 if ( Geno[ i ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ] > Geno[ i ][ j ] )
51 Geno[ i ][ j ] = Geno[ i ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ];
52 if ( Geno[ i-1 ][ j-1 ] + Matr[ V( A[ i-1 ] ) ][ V( B[ j-1 ] ) ] > Geno[ i ][ j ] )
53 Geno[ i ][ j ] = Geno[ i-1 ][ j-1 ] + Matr[ V( A[ i-1 ] ) ][ V( B[ j-1 ] ) ];
54 }
55
56 cout << Geno[ n ][ m ] << endl;
57 }
58 return 0;
59 }

posted on 2011-08-18 01:46  _xiaobai_  阅读(177)  评论(0编辑  收藏  举报