Im_hear

导航

zoj 1027

 

View Code
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int lena,lenb;
 7 char a[101],b[101];
 8 int d[103][103][3] = {0};
 9 int ans =0;
10 int cov[5][5]={{5,-1,-2,-1,-3},
11                {-1,5,-3,-2,-4},
12                     {-2,-3,5,-2,-2},
13                     {-1,-2,-2,5,-1},
14                     {-3,-4,-2,-1,0}};
15 int gts(char a)
16 {
17    if(a == 'A')return 0;
18     if(a == 'C')return 1;
19     if(a == 'G')return 2;
20    if(a == 'T')return 3;
21    if(a == '-')return 4;
22 }
23 int gt(char a,char b)
24 {
25       int x,y;
26       x = gts(a);
27       y = gts(b);
28       return cov[x][y];
29 }
30 int maxs(int a,int b){
31      return a > b?a:b;     
32 }
33 void dp()
34 { 
35         int x,y;
36      for(x = 1; x<=lena; ++x){
37                 for(y  = 1; y<=lenb; ++y){
38                           int ma = 0;
39                         if(x > 1 && y >1)ma = maxs(d[x-1][y-1][0],maxs(d[x-1][y][1],d[x][y-1][2]));    
40                         else if(x == 1 && y >1)ma = d[x][y-1][2];//such that a[x] + '-',only use a[] before 
41                         else if(x > 1 && y ==1)ma = d[x-1][y][1];//such like '-' + b[y],only use b[] before
42                           d[x][y][0] = ma + gt(a[x-1],b[y-1]);    
43                              d[x][y][1] = ma + gt(a[x-1],'-');
44                           d[x][y][2] = ma + gt('-',b[y-1]);
45               }          
46      }
47      ans = -1000;
48      d[lena][lenb][1] += gt('-',b[lenb-1]);//vip
49      d[lena][lenb][2] += gt(a[lena-1],'-');// finish until now
50      for(x=0; x<3; ++x)ans = maxs(ans,d[lena][lenb][x]);
51        return ;       
52 }
53 
54 int main()
55 {
56     int cas=0;
57     cin >> cas;
58     while(cas--){
59         cin >> lena >> a ;
60         cin >> lenb >> b;
61         dp();
62         printf("%d\n",ans);/// 
63     }
64     return 0;
65 }

posted on 2012-08-28 16:58  Im_hear  阅读(162)  评论(0编辑  收藏  举报