题目:计算两个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;
}