poj1080 - Human Gene Functions (dp)

题面
It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been interested in identifying human genes and determining their functions, because these can be used to diagnose human diseases and to design new drugs for them.
题意
在两个字符串中,添加‘-‘,使得长度相同,并且对应的权值和最大.
注意两个‘-‘ 不能对应
思路
转换为lcs问题,类似的地方在于,求出对应最大的权值,但是同时考虑不再lcs里面的,就是和‘-‘相对应

#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>

#define fuck(x) cerr<<#x<<" = "<<x<<endl;
#define debug(a, x) cerr<<#a<<"["<<x<<"] = "<<a[x]<<endl;
#define lson l,mid,ls
#define rson mid+1,r,rs
#define ls (rt<<1)
#define rs ((rt<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int loveisblue = 486;
const int maxn = 205;
const int maxm = 100086;
const int inf = 0x3f3f3f3f;
const ll Inf = 999999999999999999;
const int mod = 1000000007;
const double eps = 1e-6;
const double pi = acos(-1);

const int mat[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,5}
};

int get_id(char c){
    if(c=='A'){
        return 0;
    }else if(c=='C'){
        return 1;
    }else if(c=='G'){
        return 2;
    }else if(c=='T'){
        return 3;
    }else{
        return 4;
    }
}

char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int main() {
    ios::sync_with_stdio(true);
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif

    int T;
    scanf("%d",&T);
    while (T--){
        int len1,len2;
        scanf("%d%s",&len1,s1+1);
        scanf("%d%s",&len2,s2+1);
        for(int i=0;i<=len1;i++){
            for(int j=0;j<=len2;j++){
                dp[i][j]=-inf;
            }
        }
        dp[0][0]=0;
        for(int i=1;i<=len1;i++)
        dp[i][0]=dp[i-1][0]+mat[get_id(s1[i])][get_id('-')];
        for(int i=1;i<=len2;i++)
        dp[0][i]=dp[0][i-1]+mat[get_id(s2[i])][get_id('-')];
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+mat[get_id(s1[i])][get_id(s2[j])]);
                dp[i][j]=max(dp[i][j],dp[i-1][j]+mat[get_id(s1[i])][get_id('-')]);
                dp[i][j]=max(dp[i][j],dp[i][j-1]+mat[get_id(s2[j])][get_id('-')]);
            }
        }
        printf("%d\n",dp[len1][len2]);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/ZGQblogs/p/11569735.html

时间: 2024-10-13 07:54:51

poj1080 - Human Gene Functions (dp)的相关文章

POJ1080 Human Gene Functions 动态规划 LCS的变形

题意读了半年,唉,给你两串字符,然后长度不同,你可以用'-'把它们补成相同长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分 跟LCS很像的DP数组 dp[i][j]表示第一个字符串取第i个元素第二个字符串取第三个元素,然后再预处理一个得分表加上即可 得分表: score['A']['A'] = score['C']['C'] = score['G']['G'] = score['T']['T'] = 5; score['A']['C'] = score['C']['A'] = -1;

POJ 1080 Human Gene Functions(DP)

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18007   Accepted: 10012 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four

POJ 1080:Human Gene Functions LCS经典DP

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18007   Accepted: 10012 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four

poj 1080 Human Gene Functions(lcs,较难)

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19573   Accepted: 10919 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four

POJ 1080 Human Gene Functions(LCS)

Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been interested in identifying human genes and determining their

poj1080--Human Gene Functions(dp:LCS变形)

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17206   Accepted: 9568 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four

zoj 1027 Human Gene Functions

Human Gene Functions Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been

poj 1080 ——Human Gene Functions——————【最长公共子序列变型题】

Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17805   Accepted: 9917 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four

P 1080 Human Gene Functions

大概作了一周,终于A了 类似于求最长公共子序列,稍有变形 当前序列 ch1 中字符为 a,序列 ch2 中字符为 b 则有 3 种配对方式: 1. a 与 b 2. a 与 - 3. - 与 b 动态转移方程: dp[i][j] = max(dp[i - 1][j - 1] + g(ch1[i],ch2[j]) , dp[i - 1][j] + g(ch1[i],'-') , dp[i][j-1] + g('-',ch2[j])) 代码如下: #include<stdio.h> #includ