poj 1080 Human Gene Functions

/*
假设输入的字符串分别为 A,B
f[i][j] = { 从 A[i] 和 B[j] 开始匹配,所能达到的最大值 }
假设 A[i] = G,B[j] = C
那么现在的情况就是 
Gxxxxx
Cxxxxx
状态转移为
=> f[i + 1][j] + value(A[i], '-')
G...
-C..

=> f[i][j + 1] + value(B[j], '-')
-G..
C...

=> f[i + 1][j + 1] + value(A[i], B[j])
G...
C...
*/
//最近的LCS题都要看题解才可以写成代码,DP还不够熟悉,要多加练习才可以!come on! 
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <memory.h>
using namespace std;
const int MAX = 110;
int str1[MAX], str2[MAX], ans[MAX][MAX];

int value[][5] = {{0, -3, -4, -2, -1},
                   {-3, 5, -1, -2, -1},
                   {-4, -1, 5, -3, -2},
                   {-2, -2, -3, 5, -2},
                   {-1, -1, -2, -2, 5}};

int change(char ch)
{
    switch(ch){
               case 'A': return 1;
               case 'C': return 2;
               case 'G': return 3;
               case 'T': return 4;
    }
}

int main()
{
    int i, j, tc, len1, len2, tmp1, tmp2, tmp;
    char ch;
    cin >> tc;
    while (tc--){
          cin >> len1;
          for (i = 1; i <= len1; i++){
              cin >> ch;
              str1[i] = change(ch);
          }
          cin >> len2;
          for (i = 1; i <= len2; i++){
              cin >> ch;
              str2[i] = change(ch);
          }
          
          memset(ans, 0, sizeof(ans));
          for (i = 1; i <= len1; i++){
              ans[i][0] = value[str1[i]][0] + ans[i-1][0];
          }
          for (i = 1; i <= len2; i++){
              ans[0][i] = value[0][str2[i]] + ans[0][i-1];
          }
          
          for (i = 1; i <= len1; i++){
              for (j = 1; j <= len2; j++){
                  tmp = value[str1[i]][str2[j]] + ans[i-1][j-1];
                  tmp1 = ans[i-1][j] + value[str1[i]][0];
                  tmp2 = ans[i][j-1] + value[0][str2[j]];
                  tmp1 = max(tmp1, tmp2);
                  ans[i][j] = max(tmp, tmp1);
              }
          }
          
          cout << ans[len1][len2] << endl;
    }
    
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值