HDU 1080 Human Gene Functions - 最长公共子序列(变形)
2024-08-31 19:52:41
题目大意:
将两个字符串对齐(只包含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;
}
}
最新文章
- WinNTSetup v3.8.7 正式版绿色增强版
- 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片
- 传大附件在iis7以上的设置
- Saving HDU
- python 开发webService
- 简单的介绍下WPF中的MVVM框架
- vim自动补全
- C语言初学 计算三角形面积问题
- 程序启动缓慢-原来是hbm.xml doctype的原因
- JavaScript数组基础编程题归纳
- 设计模式之Singleton模式和Strategy模式是什么
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 解决下载经过GZip压缩后的网页乱码问题
- 深入理解ajax系列第六篇——头部信息
- IntelliJ IDEA安装主题详细步骤
- 解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题
- Xming导致的SecureCRT远程登录的普通用户图形程序不能运行
- Java调用MQ队列
- sar命令使用详解
- 20145311 《Java程序设计》第七周学习总结
热门文章
- ospp.vbs是什么文件?激活过程cscript ospp.vbs命令详解
- 推荐一款优雅高效的免费在线APP原型工具
- sql server中新增一条数据后返回该数据的ID
- 【例题 7-6 UVA - 140】Bandwidth
- 宏的使用 extern
- JS学习笔记 - fgm练习 - 输入数字求和 正则replace onkeyup事件
- Codeforces Round #258 (Div. 2)——B. Sort the Array
- IDEA 创建Web项目并在Tomcat中部署运行(转)
- UITextField用法
- php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)