洛谷 P1140 相似基因 题解
每日一题 day23 打卡
Analysis
dp[i][j]表示序列A中前i个与序列B中前j个匹配的相似度最大值
所以,dp方程很容易想到:
1.让a[i]与b[j]匹配
2.让a[i]与B序列中一个空位匹配
3.让b[j]与A序列中一个空位匹配
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+form[a[i]][b[j]],dp[i-1][j]+form[a[i]][5],dp[i][j-1]+form[5][b[j]]);
对于初始化,就是分别让每个a[i]和每个b[j]与一个空串匹配
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define maxn 100+10
#define INF 2147483647
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,m;
char s1[maxn],s2[maxn];
int str1[maxn],str2[maxn],dp[maxn][maxn];
int form[maxn][maxn]=
{
{,,,,,,},
{,,-,-,-,-},
{,-,,-,-,-},
{,-,-,,-,-},
{,-,-,-,,-},
{,-,-,-,-,}
};
inline int max_four(int x,int y,int z,int o)
{
return max(max(x,y),max(z,o));
}
signed main()
{
n=read();
for(int i=;i<=n;i++) cin>>s1[i];
m=read();
for(int i=;i<=m;i++) cin>>s2[i];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
dp[i][j]=-INF;
for(int i=;i<=n;i++)
{
if(s1[i]=='A') str1[i]=;
else if(s1[i]=='C') str1[i]=;
else if(s1[i]=='G') str1[i]=;
else if(s1[i]=='T') str1[i]=;
}
for(int i=;i<=m;i++)
{
if(s2[i]=='A') str2[i]=;
else if(s2[i]=='C') str2[i]=;
else if(s2[i]=='G') str2[i]=;
else if(s2[i]=='T') str2[i]=;
}
for(int i=;i<=n;i++) dp[i][]=dp[i-][]+form[str1[i]][];
for(int i=;i<=m;i++) dp[][i]=dp[][i-]+form[][str2[i]];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
dp[i][j]=max_four(dp[i][j],dp[i-][j-]+form[str1[i]][str2[j]],dp[i-][j]+form[str1[i]][],dp[i][j-]+form[][str2[j]]);
}
write(dp[n][m]);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P1140 相似基因 题解的更多相关文章
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷 P1140 相似基因(DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/real-l/p/9 ...
- 洛谷P1140 相似基因【线性dp】
题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配.(所以一共是5种字符) 这5 ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 洛谷P1140 相似基因
题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...
- 洛谷 P1140 相似基因 ( 线性DP || 类LCS )
题意 : 题目链接 分析 : 可以观察到给出的配对代价表中对角线部分是正数 其余的都是负数,也就是说让相同字母的匹配的越多越好 即找出 LCS 但是这里 DP 的过程需要记录一下代价 有关 LCS ...
- 【洛谷P1140 相似基因】动态规划
分析 f[i][j] 表示 1数组的第i位和2数组的第j位匹配的最大值 f[1][1]=-2 f[2][1]=-2+5=3 f[3][1]=-2+5+5=8 三个决策: 1.由f[i-1][j-1]直 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
随机推荐
- Linux命令xargs的使用
ls | xargs catls | xargs -I {} cat {} 大写I,指定参数的替换符号为{} 自定义
- Java基础系列7——集合系列(1)框架概述
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...
- Java中Date时区的转换
1.Date中保存的是什么? 在java中,只要我们执行 Date date = new Date(); 就可以得到当前时间.如: Date date = new Date(); System.ou ...
- k8s yaml格式的pod定义文件完整内容
apiVersion: v1 #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 . kind: Pod #必选,Pod metadata: #必选,元数据 ...
- 第三方dll签名
1.打开vs Tools下的工具命令 2.生成随机密钥对C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC>sn -k NonSignL ...
- 基于工作组消息队列高可用&msmq-wcf故障
场景: msmq 1# server故障手工切换到2# server,msmq-wcf service宿主服务重启后,无法成功读取消息,状似service不工作.无法监听到数据传输. 解决过程: 反复 ...
- Flutter 实现图片裁剪
实现原理很简单 ,自己绘制一个裁剪框, 根据手势 选择到适合的位置 ,然后将选中的区域绘制到一个新的图片上,从而完成裁剪 裁剪框的绘制 这里我是根据点来连线的 因为每个点上会绘制一个拉伸的标识符 ...
- dubbo源码阅读之服务目录
服务目录 服务目录对应的接口是Directory,这个接口里主要的方法是 List<Invoker<T>> list(Invocation invocation) throws ...
- 【转载】C#中ToArray方法将List集合转换为对应的数组
在C#的List集合操作中,可以使用List集合自带的ToArray方法来将List集合转换为对应的Array数组元素.ToArray方法的签名为T[] ToArray(),存在于命名空间System ...
- 关于 JS this
关于 JS this 1. this 与 普通函数 2. this 与 bind.call.apply 3. this 与 箭头函数 4. this 与 return 4.1 返回 引用对象 4.2 ...