传送门

题目大意:

将两个字符串对齐(只包含ACGT,可以用'-'占位),按照对齐分数表(参见题目)来计算最后的分数之和,输出最大的和。

例如:AGTGATG 和 GTTAG ,对齐后就是(为了表达对齐,这里我用m表示'-')

AGTGATG

mGTTAmG

题目分析:

首先看出这道题与LCS有关,下面来考虑转移:

当t1[i]==t2[j]时,和LCS一样,\(dp[i][j] = dp[i-1][j-1]+score[t1[i]][t2[j]]\)

当t1[i]!=t2[j]时,唯一不同的是这里会有3中选择:

  • 让1i-1和1j-1对齐,加上ij对齐的分数。
  • 让1i-1和1j对齐,加上i和'-'对齐的分数。
  • 让1i和1j-1对齐,加上j和'-'对齐的分数。

    取这三者的较大值。

    最后总结方程如下:

\[dp[i][j] = dp[i-1][j-1]+score[t1[i]][t2[j]] (t1[i] == t2[j])
\]

\[d[[i][j] = max(dp[i-1][j]+score[t1[i]]['-'], dp[i][j-1]+score[t2[j]]['-'], dp[i-1][j-1]+score[t1[i]][t2[j]]) (t1[i] != t2[j])
\]

code

#include <bits/stdc++.h>
using namespace std; const int N = 150, OO = 0x3f3f3f3f;
const int score[10][10] = {{0},
{0, 5, -1, -2, -1, -3},
{0, -1, 5, -3, -2, -4},
{0, -2, -3, 5, -2, -2},
{0, -1, -2, -2, 5, -1},
{0, -3, -4, -2, -1, 0}
};
int T, len1, len2;
string s1, s2;
int t1[N], t2[N], dp[N][N]; inline int getVal(char c){
switch(c) {
case 'A' : return 1; break;
case 'C' : return 2; break;
case 'G' : return 3; break;
case 'T' : return 4; break;
defualt: assert(false);
}
} inline void init(){
memset(dp, 0, sizeof dp);
for(int i=1; i<=len1; i++) dp[i][0] = dp[i-1][0] + score[t1[i]][5];
for(int i=1; i<=len2; i++) dp[0][i] = dp[0][i-1] + score[t2[i]][5];
} int main(){
freopen("h.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> T;
while(T--){
cin >> len1 >> s1 >> len2 >> s2;
for(int i=0; i<len1; i++) t1[i+1] = getVal(s1[i]);
for(int i=0; i<len2; i++) t2[i+1] = getVal(s2[i]);
init();
for (int i=1; i<=len1; i++)
for (int j=1; j<=len2; j++) {
if(t1[i] == t2[j]) dp[i][j] = dp[i-1][j-1] + score[t1[i]][t2[j]];
else dp[i][j] = max(dp[i - 1][j - 1] + score[t1[i]][t2[j]],
max(dp[i - 1][j] + score[t1[i]][5],
dp[i][j - 1] + score[t2[j]][5]));
} cout << dp[len1][len2] << endl;
}
}

HDU 1080 Human Gene Functions - 最长公共子序列(变形)的更多相关文章

  1. poj 1080 Human Gene Functions (最长公共子序列变形)

    题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...

  2. HDU 1080 Human Gene Functions

    最长公共子序列的变形 题目大意:给出两个基因序列,求这两个序列的最大相似度. 题目中的表格给出了两两脱氧核苷酸的相似度. 状态转移方程为: dp[i][j] = max(dp[i-1][j]+Simi ...

  3. hdu 1080 Human Gene Functions(DP)

    题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...

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

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17805   Accepted:  ...

  5. poj 1080 Human Gene Functions(lcs,较难)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19573   Accepted:  ...

  6. P 1080 Human Gene Functions

    大概作了一周,终于A了 类似于求最长公共子序列,稍有变形 当前序列 ch1 中字符为 a,序列 ch2 中字符为 b 则有 3 种配对方式: 1. a 与 b 2. a 与 - 3. - 与 b 动态 ...

  7. hdu 1080 dp(最长公共子序列变形)

    题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G -  G ...

  8. hdu 1159 Common Subsequence(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  9. hdu 1159 Common Subsequence(LCS最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. 在同一个局域网下实时访问vue项目,移动端也可以。

    之前,UI看做好的页面效果,一直都是把项目打包好后放上服务器跑. 现在,UI能实时看到我的项目的页面效果情况了. 那么问题来了!!! 要怎样做到呢??? 接下来照做就行了!!! 请您先打开项目下的pa ...

  2. 15、python学习手册之:列表和字典

    1.列表属于可变序列,支持在原处的修改 2.在标准python解锁器内部,列表就是C数组而不是链接结构 3.内置函数map对序列中的各项应用一个函数并把结果收集到一个新的列表中 eg:list(map ...

  3. Docker---(6)问题:bash: vi: command not found

    原文:Docker---(6)问题:bash: vi: command not found 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://bl ...

  4. JSP中的EL表达式详细介绍

    一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素.它们通常用于对象操作以及执行那些 ...

  5. Day2:数据运算

    一.算数运算 如: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan print(10%2) #求模(取模) # 0 ...

  6. IT从业人员关注哪些问题

    技术人员关注的问题非常多,但常见的至少有以下6种.特此整理,抓住核心问题,解决它. 一个人的精力和时间往往非常有限,能把核心问题都解决到位就是成功. 1.职业规划 大家从读小学开始,就是在为职业规划过 ...

  7. 【Codeforces Round #437 (Div. 2) B】Save the problem!

    [链接]h在这里写链接 [题意]     给你一个金额N,和硬币的类型总数M;     (完全背包),然后问你组成N的方案数.     使得,用这些硬币组成价值为N的金额的方案数为A;     现在A ...

  8. 【Codeforces Round #437 (Div. 2) C】 Ordering Pizza

    [链接]h在这里写链接 [题意]     给你参赛者的数量以及一个整数S表示每块披萨的片数.     每个参数者有3个参数,si,ai,bi;     表示第i个参赛者它要吃的披萨的片数,以及吃一片第 ...

  9. bootstrap+fileinput插件实现可预览上传照片功能

    实际项目中运用: 功能:实现上传图片,更改上传图片,移除图片的功能 <!DOCTYPE html> <html> <head> <meta charset=& ...

  10. System.ComponentModel.Win32Exception (0x80004005):拒绝访问。——解决办法

    一.问题如下: (无法执行程序.所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfi ...