题目链接:

https://www.luogu.org/problemnew/show/P1140

题目背景

大家都知道,基因可以看作一个碱基对序列。它包含了44种核苷酸,简记作A,C,G,TA,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。

在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。

题目描述

两个基因的相似度的计算方法如下:

对于两个已知基因,例如AGTGATGAGTGATG和GTTAGGTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:

这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:

那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9(−3)+5+5+(−2)+(−3)+5+(−3)+5=9。因为两个基因的对应方法不唯一,例如又有:

相似度为:(-3)+5+5+(-2)+5+(-1)+5=14(−3)+5+5+(−2)+5+(−1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。

输入输出格式

输入格式:

共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,TA,C,G,T四个字母。1 \le1≤序列的长度\le 100≤100。

输出格式:

仅一行,即输入基因的相似度。

输入输出样例

输入样例#1: 复制

7 AGTGATG
5 GTTAG
输出样例#1: 复制

14

解题思路:

动态规划。难点在于理解递推关系。

以输入

3 ATG
2 CG

为例:

设f(i,j)为第一个字符串的前i个字符与第二个字符串的前j个字符之间的距离,那么当计算f(3,2)时的可能情况有:

情况1:
ATG
-CG
此时f(3,2)=f(2,1)+dis('G','G')
情况2:
ATG-
--CG
此时b[1]与空格相对,f(3,2)=f(3,1)+dis('-','G')
情况3:
ATG
CG-
此时a[2]与空格相对,f(3,2)=f(2,2)+dis('G','-')

综上,递推公式为:

$ f(i,j)=max\{f(i-1,j-1)+dis(i,j),f(i-1,j)+dis(i,4),f(i,j-1)+dis(4,j)\} $

#include<iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
int mp[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,0};
int f[110][110];
string a,b;
map<char,int> mpp;
int main(){
int l1,l2;
cin>>l1>>a>>l2>>b;
mpp['A']=0;mpp['C']=1;mpp['G']=2;mpp['T']=3;mpp['-']=4;
for(int i=0;i<=l1;i++) for(int j=0;j<=l2;j++) f[i][j]=-999999999;//初始化成很小的值,因为字符与字符之间的距离可能为负数 f[0][0]=0; for(int i=1;i<=l1;i++) f[i][0]=f[i-1][0]+mp[mpp[a[i-1]]][4];//边界处理,需要累积之前的记录
for(int j=1;j<=l2;j++) f[0][j]=f[0][j-1]+mp[4][mpp[b[j-1]]];// for(int i=1;i<=l1;i++){
int na=mpp[a[i-1]];
for(int j=1;j<=l2;j++){
int nb=mpp[b[j-1]];
f[i][j]=max(f[i][j],f[i-1][j-1]+mp[na][nb]);//a[i]与b[j]匹配
f[i][j]=max(f[i][j],f[i-1][j]+mp[na][4]);//a[i]与空格匹配
f[i][j]=max(f[i][j],f[i][j-1]+mp[4][nb]);//空格与b[j]匹配
}
} printf("%d\n",f[l1][l2]);
}

P1140 相似基因(字符串距离,递推)的更多相关文章

  1. 牛客练习赛37-筱玛的字符串-DP递推

    筱玛的字符串 思路 :dp [ i ] [ j ] [ 3 ] 分别代表到第 i 位时 左括号比右括号多 j ,后面有三个状态 分别表示当前位置 S3的字符 是正在反转的,还是 反转完成的,还是没有反 ...

  2. HDU 5459 Jesus Is Here (递推,组合数学)

    有点麻烦的递推,递推的原则:向小的问题方向分解,注意边界. 字符串的递推式为 定义f为Si中的总方案数 首先可以得到 fi=fi-1+fi-2+组合(si-2,si-1) 然后考虑Si-2和Si-1之 ...

  3. HDU - 2604 矩阵快速幂 字符串递推 两种解法

    记dp[i]为长度i且符合题意的方案数,dp[n]就是解 符合方案的是不含fmf和fff子串的字符串 考虑如何从前面几项递推出后面第i项 (★表示存在生成的非法方案)←其实没啥用处 i=1时 m③ f ...

  4. NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

    Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...

  5. hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4

    题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...

  6. 递推DP HDOJ 5459 Jesus Is Here

    题目传送门 题意:简单来说就是sn = sn-1 + sn-2递推而来,求其中所有c字符的:∑i<j:sn[i..i+2]=sn[j..j+2]=‘‘cff"(j−i) mod 530 ...

  7. HDU2067/HDU1267 /HDU1130 递推

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  9. 第46套题【STL】【贪心】【递推】【BFS 图】

    已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...

  10. LA 4123 (计数 递推) Glenbow Museum

    题意: 这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R. 如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的.这 ...

随机推荐

  1. GET和POST的区别与联系

    每日知识-GET和POST HTTP:超文本传输协议 组成部分:请求行,请求头部,一个空行,请求数据 GET和POST GET:get就是获取的意思,默认的HTTP请求方式,把参数通过 key/val ...

  2. Docker(一):Docker安装

    简介   Docker是dotcloud公司开源的一款产品,主要基于PAAS平台为开发者提供服务.是解决运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术. Docker组件 ...

  3. strin 字符串的内置函数

    count("x")统计字符串的元素的个数 a = "hello kitty" print (a.count("t"))#统计t出现的个数 ...

  4. js下 Day03、DOM操作--节点方法

    语法:parentNode.appendChild(child) 功能:向父节点的子节点列表的末尾添加新的子节点 语法:parentNode.removeChild(child) 功能:从子节点列表中 ...

  5. Python高级语法-多继承MRO相关-多继承顺序(4.5.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 使用类的魔法方法__mro__ 可以查看他的父类调用顺序 还有调用父类的构造方法的时候,使用super调用,里面有C3算法支持,不会重复调用相同的祖先 ...

  6. angular8 大地老师学习笔记---第九课

    父组件:news组件 <app-header [title]="title" [msg]="msg" [run]='run' [home]='this'& ...

  7. Python的一个mysql实例

    按公司名统计一定时期内入货的总车数,总重量还有总价格.数据表如下: 要用到的库是pymysql,读取excel表格的xlrd,写入excel的xlwt和复制excel模板的xlutils,代码如下: ...

  8. 安装篇五:安装MySQL(5.6.38版本)

    #1.MySQL安装 #1.准备环境 # No1:关闭:(iptables)selinux # No2:下载好安装包(这里使用 mysql-5.6.38.tar.gz 包安装) # No3:安装依赖包 ...

  9. 国产的开源数据库——GitHub 热点速览 Vol.52

    作者:HelloGitHub-小鱼干 本以为本周的 GitHub 和十二月一样平平无奇就那么度过了,结果 BackgroundMattingV2 重新刷新了本人的认知,还能这种骚操作在线实时抠视频去背 ...

  10. JPA 缓存

    JPA有两种类型的缓存: EntityManager自身就是一种缓存.事务中从数据库获取的和写入到数据库的数据会被缓存(什么样的数据会被缓存,在后面有介绍).在一个程序中也许会有很多个不同的Entit ...