传送门

题目大意:

将两个字符串对齐(只包含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. 【例题 7-1 UVA - 725】Division

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举分母从0到99999. 得到分子,判断合法 [代码] /* 1.Shoud it use long long ? 2.Have ...

  2. OpenWrt配置绿联的usb转Ethernet网口驱动

    这个选择kernel modules中的kmod-usb-net-asix 须要加入网络设备接口.相似建立一个vlan,配置下防火墙之类的.

  3. amazeui学习笔记--css(基本样式3)--文字排版Typography

    amazeui学习笔记--css(基本样式3)--文字排版Typography 一.总结 1.字体:amaze默认非 衬线字体(sans-serif) 2.引用块blockquote和定义列表:引用块 ...

  4. 使用 STL 辅助解决算法问题

    不要重复制造轮子,而且你造的轮子未必比得上别人的: <numeric>⇒ accumulate,累积容器中区间的和,可以指定初值: 为什么 STL 中的容器和算法一定关于区间的操作一定是左 ...

  5. (最新)使用爬虫刷CSDN博客访问量——亲测有效

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 1.概述 前言:前两天刚写了第一篇博客https://blog.csdn.net/qq_41782425/article/deta ...

  6. [Flexbox] Use Flex to Scale Background Image

    In this lesson we will use Flexbox to scale a background image to fit on the screen of our React Nat ...

  7. 使用u盘量产工具修复写保护的u盘

    自己的u盘突然提示写保护,而且也没有写保护开关,怎么都写不进文件,试了很多办法都无法去除写保护,最后找了一个u盘量产工具,搞定: 插上u盘后,会检测到u盘,点“开始"后静静等待它完成,u盘又 ...

  8. 7、linux之定时器

    (1) 一个timer_list 结构体的实例对应一个定时器,其定义如下: struct timer_list { struct list_head entry, /*定时器列表*/ unsigned ...

  9. ds finder 唤醒

    http://www.hangge.com/blog/cache/detail_594.html

  10. Ubuntu12.04LTS SDK无法更新

    1.打开终端输入sudo gedit /etc/hosts 加入下面 2.加入下列文字到文件里:       203.208.46.146 dl.google.com       203.208.46 ...