ZOJ 1027 Human Gene Functions

看完题后我 想到是最长公共子序列的变形,可就是想不出来状态转移方程,还是做得题少啊。。抓紧练习 。

 

给出两个核苷酸序列,每个可以插入-号使其长度相等,一一对应,对其进行比较,把每一个字符对按照表格对应的关系,求出数值,然后把所有的数值 加起来得到score,看看那种对应方式得到的score最大。。。。

 

还是用c++,模仿了别人的程序,。。。。。

 

#include<iostream> using namespace std; int va[5][5] = {0,-3,-4,-2,-1, -3,5,-1,-2,-1, -4,-1,5,-3,-2, -2,-2,-3,5,-2, -1,-1,-2,-2,5}; int max(int a,int b,int c) { int k = a>b?a:b; return k>c?k:c; } int main() { const int MAX = 101; int cases; int i,j; int a[MAX],b[MAX],opt[MAX][MAX]; char c; cin >> cases; while(cases--) { int len1,len2; cin >> len1; for(i = 1 ; i <= len1 ; i++ ) { cin >> c; switch(c) { case 'A':a[i] = 1;break; case 'C':a[i] = 2;break; case 'G':a[i] = 3;break; case 'T':a[i] = 4;break; } } cin >> len2; for(i = 1 ; i <= len2 ; i++ ) { cin >> c; switch(c) { case 'A':b[i] = 1;break; case 'C':b[i] = 2;break; case 'G':b[i] = 3;break; case 'T':b[i] = 4;break; } } //以上是初始化 opt[0][0]; for(i = 1 ; i <= len1 ; i++ ) opt[i][0] = opt[i-1][0] + va[ a[i] ][0]; for(i = 1 ; i <= len2 ; i++ ) opt[0][i] = opt[0][i-1] + va[0][ b[i] ]; for(i = 1 ; i <= len1 ; i++ ) for(j = 1 ; j <= len2 ; j++ ) opt[i][j] = max(opt[i-1][j-1] + va[ a[i] ][ b[j] ], opt[i][j-1] + va[0][ b[j] ], opt[i-1][j] + va[ a[i] ][0] ); cout << opt[len1][len2] << endl; } return 0; }

你可能感兴趣的:(c)