P1140 相似基因

考虑如何设计状态。

设给出的两个串为串 \(A\) 和串 \(B\),长度分别为 \(n\) 和 \(m\)。

我们用 \(f[i][j]\) 来表示前 \(i\) 个 \(A\) 串碱基和前 \(j\) 个 \(B\) 串碱基得到的最大相似度。

我们因为求的是最大的相似度,而从题目给的表来看是可能为负的,所以先初始化一下 \(f[i][j]\) 数组。

那么我们就考虑到有三种转移的方式:

  1. 当前 \(A\) 串插入一个空碱基。

  2. 当前 \(B\) 串插入一个空碱基。

  3. 当前串不插入空碱基,直接进行相似度比对。

两个串都插入空碱基相当于没插入,所以不考虑。

我们知道一个空串和碱基序列的相似度就是相当于碱基序列都是和空碱基进行相似度比对,所以我们要进行一个小小的预处理。

code:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define int long long
#define N 1010
using namespace std;
int n,m,f[N][N],a[N],b[N];
string s1,s2;
int mp[10][10]=
{
{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},
};
inline void init(int len,string a,int b[])
{
for(int i=1;i<=len;i++)
{
if(a[i-1]=='A')b[i]=0;
if(a[i-1]=='C')b[i]=1;
if(a[i-1]=='G')b[i]=2;
if(a[i-1]=='T')b[i]=3;
}
}
signed main()
{
cin>>n>>s1>>m>>s2;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[i][j]=-INF;//预处理
init(n,s1,a);
init(m,s2,b);
for(int i=1;i<=n;i++)f[i][0]=f[i-1][0]+mp[a[i]][4];//预处理
for(int i=1;i<=m;i++)f[0][i]=f[0][i-1]+mp[b[i]][4];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=max(f[i][j],f[i-1][j]+mp[a[i]][4]);//A串插入空碱基
f[i][j]=max(f[i][j],f[i][j-1]+mp[b[j]][4]);//B串插入空碱基
f[i][j]=max(f[i][j],f[i-1][j-1]+mp[a[i]][b[j]]);//不插入空碱基
}
}
cout<<f[n][m]<<endl;
return 0;
}

P1279 字串距离

一眼看去和上面那道题目一样,区别就是更好写了,因为加的值都能直接得出。

同样分三种情况转移。

code:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define int long long
#define N 2010
using namespace std;
string s1,s2;
int n,m,k,f[N][N],a[N],b[N];
signed main()
{
cin>>s1>>s2>>k;
n=s1.size();
m=s2.size();
for(int i=1;i<=n;i++)a[i]=s1[i-1]-'a';//字符转数字方便计算,同时把下标从0开始改为从1开始
for(int i=1;i<=m;i++)b[i]=s2[i-1]-'a';
memset(f,INF,sizeof f);f[0][0]=0;//赋初值,f[0][0]特殊处理
for(int i=1;i<=n;i++)f[i][0]=f[i-1][0]+k;//预处理和空串匹配的距离
for(int i=1;i<=m;i++)f[0][i]=f[0][i-1]+k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=min(f[i][j],f[i-1][j]+k);//往j中插入空格
f[i][j]=min(f[i][j],f[i][j-1]+k);//往i中插入空格
f[i][j]=min(f[i][j],f[i-1][j-1]+abs(a[i]-b[j]));//不插入空格,直接计算两个字符的ascll码的差值
}
}
cout<<f[n][m]<<endl;
return 0;
}

DP做题记录的更多相关文章

  1. DP 做题记录 II.

    里面会有一些数据结构优化 DP 的题目(如 XI.),以及普通 DP. *I. P3643 [APIO2016]划艇 题意简述:给出序列 \(a_i,b_i\),求出有多少序列 \(c_i\) 满足 ...

  2. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  3. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  4. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  5. DP刷题记录(持续更新)

    DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...

  6. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  7. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  8. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  9. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  10. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

随机推荐

  1. JavaScript argument

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 安装Win11需要网络才能下一步怎么跳过

    1.先Shift+F10打开命令提示符 2.运行C:\Windows\System32\oobe\BypassNRO.cmd 3.自动重启来到联网这一步,多了一个没有网络的选项,进入.

  3. windows中使用jenkins部署项目,后端无法启动问题

    忙活一下午+一上午,问题终于解决了.找了各种办法,最终解决方式如下: 1.jenkins打包成功,到接口会报502异常 原因:后端未成功启动 解决办法: 1.刚开始使用shell命令,无法查杀进程,后 ...

  4. 如何使用webgl(three.js)实现3D消防、3D建筑消防大楼、消防数字孪生、消防可视化解决方案——第十八课(一)

    序: 又是很久没出随笔文章了,一篇文章有时候整理一天,实在是抽不出来时间. 最近在回顾几年前的项目时,发现这个智慧三维消防可视化项目很有回顾价值,索性就拿出来讲讲. 首先,我们要知道消防里的知识,不是 ...

  5. Spring--案例:百度网盘密码数据兼容处理

    案例再度来袭 也就是说,在百度网盘的密码复制时,后面即使有空格也能提取成功(trim方法) 案例的实现: 也就是实现存在空格时,也能输出true: 现在的话: 那么,我们应该如何使得它忽略空格呢? 这 ...

  6. linux 常用的查找命令

    linux 常用的查找命令 查找文件内容 grep grep -nr "str" path -nr: n是line number行号,r是recursive,可以理解为遍历文件文件 ...

  7. ⾼性能IO模型:为什么单线程Redis能那么快

      Redis是单线程,主要是指Redis的⽹络IO和键值对读写是由⼀个线程来完成的,这也是Redis对外提供键值存储服务的主要流程.但Redis的其他功能,⽐如持久化.异步删除.集群数据同步等,其实 ...

  8. 自己动手从零写桌面操作系统GrapeOS系列教程——16.封装打印字符串函数

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 在上一讲中我们向屏幕打印字符串"GrapeOS"用了十几行汇编代码,如果要输出的字符比较多,这种方法太繁琐了.本讲我们将打印 ...

  9. while与do-while的区别是什么,怎么用?

    前言 在上一篇文章中,壹哥给大家讲解了循环的概念,并重点给大家讲解了for循环的使用.但在Java中,除了for循环之外,还有while.do-while.foreach等循环形式.今天壹哥就再用一篇 ...

  10. pip更新一直time out 的解决方法

    python -m pip install -U --force-reinstall pip 或者指定安装的镜像, 这里以安装numpy为例,运行pip install numpy -i http:/ ...