poj1080

dp。

#include
#include
#include
using namespace std;
const int inf = 1e9;
int T;
int n, n2;
string a, b;
int s[89][89];
int dp[105][105];
int main()
{
    s['A']['A'] = 5, s['A']['C'] = -1, s['A']['G'] = -2, s['A']['T'] = -1, s['A']['-'] = -3;
    s['C']['A'] = -1, s['C']['C'] = 5, s['C']['G'] = -3, s['C']['T'] = -2, s['C']['-'] = -4;
    s['G']['A'] = -2, s['G']['C'] = -3, s['G']['G'] = 5, s['G']['T'] = -2, s['G']['-'] = -2;
    s['T']['A'] = -1, s['T']['C'] = -2, s['T']['G'] = -2, s['T']['T'] = 5, s['T']['-'] = -1;
    s['-']['A'] = -3, s['-']['C'] = -4, s['-']['G'] = -2, s['-']['T'] = -1;
    cin >> T;
    while(T --)
    {
        fill(dp[0], dp[0] + 105 * 105, -inf);
        cin >> n >> a;
        cin >> n2 >> b;
        dp[0][0] = 0;
        for(int i = 1; i <= n; i ++)
            dp[i][0] = dp[i - 1][0] + s[a[i - 1]]['-'];
        for(int i = 1; i <= n2; i ++)
            dp[0][i] = dp[0][i - 1] + s['-'][b[i - 1]];
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n2; j ++)
            {
                dp[i][j] = dp[i - 1][j - 1] + s[a[i - 1]][b[j - 1]];
                dp[i][j] = max(dp[i][j], dp[i - 1][j] + s[a[i - 1]]['-']);
                dp[i][j] = max(dp[i][j], dp[i][j - 1] + s['-'][b[j - 1]]);
            }
        cout << dp[n][n2] << endl;
    }
    // system("pause");
    return 0;
}

你可能感兴趣的:(poj1080)