poj1080
来源:互联网 发布:c语言做图形界面 编辑:程序博客网 时间:2024/05/29 17:35
#include <iostream>using namespace std;const int MAXN = 101;int dp[MAXN][MAXN];int score[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 change(char ch){ if (ch == 'A') { return 0; } else if (ch == 'C') { return 1; } else if (ch == 'G') { return 2; } else if (ch == 'T') { return 3; } else { return 4; }}char A[MAXN], B[MAXN];int maxs(int a, int b, int c){ return max(a, max(b, c));}void input(){ int t, a, b; cin >> t; while (t--) { cin >> a; for (int i = 0; i < a; i++) { cin >> A[i]; } cin >> b; for (int i = 0; i < b; i++) { cin >> B[i]; } dp[0][0] = 0; for (int i = 1; i <= a; i++) { dp[i][0] = dp[i - 1][0] + score[change(A[i - 1])][change('-')]; } for (int i = 1; i <= b; i++) { dp[0][i] = dp[0][i - 1] + score[change('-')][change(B[i - 1])]; } for (int i = 1; i <= a; i++) { for (int j = 1; j <= b; j++) { dp[i][j] = maxs(dp[i][j - 1] + score[change('-')][change(B[j - 1])], dp[i - 1][j] + score[change(A[i - 1])][change('-')], dp[i - 1][j - 1] + score[change(A[i - 1])][change(B[j - 1])]); } } cout << dp[a][b] << endl; }}int main(){ input(); return 0;}