http://acm.pku.edu.cn/JudgeOnline/problem?id=1080

Код:
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
#define MAX(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
int ctoi(char a)
{
int b;
if(a=='A') b = 0;
if(a=='C') b = 1;
if(a=='G') b = 2;
if(a=='T') b = 3;
if(a=='-') b = 4;
return b;
}
int main()
{
int t,j,k,m,n;
int f1,f2,f3;
int f[101][101];
int arr[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}
};
string a,b;
cin>>t;
while(t--)
{
j = k = 0;
memset(f,0,sizeof(f));
cin>>m>>a;
cin>>n>>b;
for(j=0;j<=m;j++)
{
for(k=0;k<=n;k++)
{
if(j == 0 && k == 0)
{
f[j][k] = 0;
}
else if(j==0)
{
f[j][k] = f[j][k-1] + arr[ctoi('-')][ctoi(b[k-1])];
}
else if(k==0)
{
f[j][k] = f[j-1][k] + arr[ctoi(a[j-1])][ctoi('-')];
}
else
{
f1 = f[j-1][k] + arr[ctoi(a[j-1])][ctoi( '-')];
f2 = f[j][k-1] + arr[ctoi( '-')][ctoi(b[k-1])];
f3 = f[j-1][k-1] + arr[ctoi(a[j-1])][ctoi(b[k-1])];
f[j][k] = MAX(f1,f2,f3);
}
}
}
cout<<f[m][n]<<endl;
}
return 0;
}