zoj 1027 - Human Gene Functions

来源:互联网 发布:php获取字符串每个字母 编辑:程序博客网 时间:2024/04/29 10:03

题目:计算两个DNA串的,最大权值公共子序列。

分析:dp,LCS。

说明:注意初始化。(2011-09-19 09:49)

#include <iostream>#include <cstdlib>using namespace std;int Geno[ 210 ][ 210 ];int Matr[ 5 ][ 5 ] = {        { 5,-1,-2,-1,-3},        {-1, 5,-3,-2,-4},        {-2,-3, 5,-2,-2},        {-1,-2,-2, 5,-1},        {-3,-4,-2,-1, 0}}; int V( char C ){    switch( C ) {        case 'A':    return 0;        case 'C':    return 1;        case 'G':    return 2;        case 'T':    return 3;        case '-':    return 4;    }}char A[ 110 ];char B[ 110 ];int main(){    int t,n,m;    while ( cin >> t )    while ( t -- ) {        cin >> n >> A >> m >> B;                for ( int i = 0 ; i <= n ; ++ i )        for ( int j = 0 ; j <= m ; ++ j )            Geno[ i ][ j ] = -11111;                Geno[ 0 ][ 0 ] = 0;        for ( int i = 1 ; i <= n ; ++ i )            Geno[ i ][ 0 ] = Geno[ i-1 ][ 0 ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ];                    for ( int j = 1 ; j <= m ; ++ j )            Geno[ 0 ][ j ] = Geno[ 0 ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ];                    for ( int i = 1 ; i <= n ; ++ i )        for ( int j = 1 ; j <= m ; ++ j ) {            if ( Geno[ i-1 ][ j ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ] > Geno[ i ][ j ] )                Geno[ i ][ j ] = Geno[ i-1 ][ j ] + Matr[ V( A[ i-1 ] ) ][ V( '-' ) ];            if ( Geno[ i ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ] > Geno[ i ][ j ] )                Geno[ i ][ j ] = Geno[ i ][ j-1 ] + Matr[ V( '-' ) ][ V( B[ j-1 ] ) ];            if ( Geno[ i-1 ][ j-1 ] + Matr[ V( A[ i-1 ] ) ][ V( B[ j-1 ] ) ] > Geno[ i ][ j ] )                Geno[ i ][ j ] = Geno[ i-1 ][ j-1 ] + Matr[ V( A[ i-1 ] ) ][ V( B[ j-1 ] ) ];        }                        cout << Geno[ n ][ m ] << endl;     }    return 0;} 

0 0
原创粉丝点击