Human Gene Functions POJ - 1080

類似LCS匹配

#include<cstdio>
#include <algorithm>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> P;
const int MAX_N = 110;
const int MAX_M = 10000;
int ss[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,-(1<<30)}
        };
int dp[MAX_N][MAX_N];
char s[MAX_N],t[MAX_N];
int N,M;
int loc(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 if (ch == '-')return 4;
}
void solve() {
    dp[0][0] = 0;
    for (int i = 1;i <= N;i++) {
        dp[i][0] = ss[loc('-')][loc(s[i])] + dp[i-1][0];
    }
    for (int i = 1;i <= M;i++) {
        dp[0][i] = ss[loc('-')][loc(t[i])] + dp[0][i-1];
    }
    for (int i = 1;i <= N;i++) {
        for (int j = 1;j <= M;j++) {
            int temp1 = dp[i -1][j -1] + ss[loc(s[i])][loc(t[j])];
            int temp2 = dp[i -1][j] + ss[loc(s[i])][loc('-')];
            int temp3 = dp[i][j -1] + ss[loc('-')][loc(t[j])];
            dp[i][j] = max(temp1,max(temp2,temp3));
        }
    }
}
int main() {
    int T;
//    for (int i = 0;i < 5;i++) {
//        for (int j = 0;j < 5;j++) {
//            printf("%d ",ss[i][j]);
//        }
//        printf("\n");
//
//    }
    sci(T);
    while (T--) {
        sci(N); scanf("%s",s+1);
        sci(M); scanf("%s",t+1);
        solve();
        printf("%d\n",dp[N][M]);
    }

    return 0;
}
發佈了120 篇原創文章 · 獲贊 3 · 訪問量 5395
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章