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 }