传送门

题目大意:

将两个字符串对齐(只包含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;
}
}

最新文章

  1. WinNTSetup v3.8.7 正式版绿色增强版
  2. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片
  3. 传大附件在iis7以上的设置
  4. Saving HDU
  5. python 开发webService
  6. 简单的介绍下WPF中的MVVM框架
  7. vim自动补全
  8. C语言初学 计算三角形面积问题
  9. 程序启动缓慢-原来是hbm.xml doctype的原因
  10. JavaScript数组基础编程题归纳
  11. 设计模式之Singleton模式和Strategy模式是什么
  12. C#利用反射实现两个类的对象之间相同属性的值的复制
  13. 解决下载经过GZip压缩后的网页乱码问题
  14. 深入理解ajax系列第六篇——头部信息
  15. IntelliJ IDEA安装主题详细步骤
  16. 解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题
  17. Xming导致的SecureCRT远程登录的普通用户图形程序不能运行
  18. Java调用MQ队列
  19. sar命令使用详解
  20. 20145311 《Java程序设计》第七周学习总结

热门文章

  1. ospp.vbs是什么文件?激活过程cscript ospp.vbs命令详解
  2. 推荐一款优雅高效的免费在线APP原型工具
  3. sql server中新增一条数据后返回该数据的ID
  4. 【例题 7-6 UVA - 140】Bandwidth
  5. 宏的使用 extern
  6. JS学习笔记 - fgm练习 - 输入数字求和 正则replace onkeyup事件
  7. Codeforces Round #258 (Div. 2)——B. Sort the Array
  8. IDEA 创建Web项目并在Tomcat中部署运行(转)
  9. UITextField用法
  10. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)