首页 > 其他分享 >洛谷题单指南-动态规划3-P1140 相似基因

洛谷题单指南-动态规划3-P1140 相似基因

时间:2024-05-13 18:09:30浏览次数:14  
标签:指南 字符 int 洛谷题 P1140 相似 序列 配对 dp

原题链接:https://www.luogu.com.cn/problem/P1140

题意解读:两个只包含A、C、G、T4个字符的序列,根据已经定义好的字符-字符的相似度,计算两个序列最大的相似度,两个序列必须每个字符都配对,如果字符不够,可以插入'-'代替。

解题思路:

本题要解决几个问题:

1、状态表示

既然有两个序列,设分别为a[n]、b[m],很容易想到设dp[i][j]表示a序列1~i和b序列1~j的相似度

为了方便查表计算字符-字符对应的相似度,可以将'A'、'C'、'G'、'T'、'-'转换为0,1,2,3,4

这样可以用二维数组保存所有的相似度关系:

int s[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
};

2、状态转移

对与a[1~i]和b[1~j],重点考虑最后一个字符的配对关系,有三种可能:

a[i]和b[j]配对:dp[i][j] = dp[i-1][j-1] + s[a[i]][b[j]]

在a[i]后面插入'-',用'-'和b[i]配对:dp[i][j] = dp[i][j-1] + s[4][b[j]]

在b[i]后面插入'-',用a[i]和'-'配对:dp[i][j] = dp[i-1][j] + s[a[i]][4]

以上三种情况取max即可

3、初始化

由于i,j都从1开始枚举,而递推式中会依赖于i-1,j-1,因此要对dp[i][0]以及dp[0][i]进行初始化

dp[i][0]表示a[1~i]与空串的相似度,就是a中每个字符与'-'配对的相似度之和

dp[0][i]表示空串与b[1~i]的相似度,就是'-'与b中每个字符配对的相似度之和

dp[0][0]保持0即可,没有配对发生

4、结果

dp[n][m]

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 105;
int n, m;
int a[N], b[N]; //对应两组碱基序列, A,C,G,T分别对应0,1,2,3,-对应4
int dp[N][N]; //dp[i][j]表示a序列1~i和b序列1~j的相似度
int s[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 getnum(char x)
{
    if(x == 'A') return 0;
    if(x == 'C') return 1;
    if(x == 'G') return 2;
    if(x == 'T') return 3;
    if(x == '-') return 4;
}

int main()
{
    char x;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> x;
        a[i] = getnum(x);
    }
    cin >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> x;
        b[i] = getnum(x);
    }

    for(int i = 1; i <= n; i++)
    {
        dp[i][0] = dp[i-1][0] + s[a[i]][4]; //初始化所有的dp[i][0]为a:1~i对应'-'的相似度之和
    }
    for(int i = 1; i <= m; i++)
    {
        dp[0][i] = dp[0][i-1] + s[4][b[i]]; //初始化所有的dp[0][i]为'-'对应b:1~i的相似度之和
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            dp[i][j] = max(dp[i-1][j-1] + s[a[i]][b[j]], max(dp[i][j-1] + s[4][b[j]], dp[i-1][j] + s[a[i]][4]));
        }
    }
    cout << dp[n][m];

    return 0;
}

 

标签:指南,字符,int,洛谷题,P1140,相似,序列,配对,dp
From: https://www.cnblogs.com/jcwy/p/18189727

相关文章

  • 【java】问题排查-内存溢出(OOM)-汇总指南
    1、java.lang.OutOfMemoryError:Javaheapspace原因分析示例解决方案2、java.lang.OutOfMemoryError:GCoverheadlimitexceeded原因分析示例解决方案3、java.lang.OutOfMemoryError:Permgenspace原因分析示例解决方案4、java.lang.OutOfMemoryErr......
  • 野火指南者STM32F103+STM32CubeMX FSMC实现LCD屏幕显示
    MCU:STM32F103VET6开发环境:STM32CubeMX+MDK5最近针对STM32的LCD进行复习,顺便展开一下笔记。 STM32LCD液晶屏(ILI9341)本文章使用STM32F103VET6,野火指南者的3.2寸电阻屏,进行学习。 LCD液晶显示针对野火指南者配套资料:3.2寸LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,......
  • 洛谷题单指南-动态规划3-P1880 [NOI1995] 石子合并
    原题链接:https://www.luogu.com.cn/problem/P1880题意解读:计算n堆石子合并的最小、最大得分,只不过这n堆石子是环形的,也就是首、尾也相邻,是区间DP的升级版-环形DP问题。解题思路:如果是常规区间DP的方法:对于n堆石子,考察区间的长度范围是1~n先枚举左端点i,范围是1~n再计算右......
  • 探索Django:从项目创建到图片上传的全方位指南
    Django是什么Django是一个流行的PythonWeb开发框架,它提供了一系列工具和库,用于帮助开发人员构建高效、可扩展的Web应用程序。Django的目标是让开发者能够以快速和简单的方式构建复杂的Web应用,通过提供许多预构建的组件和功能,如ORM(对象关系映射)、表单处理、认证系统、管......
  • 洛谷题单指南-动态规划3-P3205 [HNOI2010] 合唱队
    原题链接:https://www.luogu.com.cn/problem/P3205题意解读:给定理想队形,计算初始队形的方案数。解题思路:对于给定理想队形,最后一个人插入有两种可能:从左边插入、从右边插入从左边插入,则意味着前一个数比当前数大,前一个数有可能在左边也有可能在右边从右边插入,则意味着前一个数......
  • autoit au3 IT管理员使用指南(二)自动安装软件基础
    简介上篇介绍了au3的基本操作流程,对于我们要自动安装软件,那么就是要安装某个软件,执行一个程序。本篇介绍执行一个程序。Run我们可以通过Run命令来执行一个程序,那么我们尝试执行一下搜狗输入法吧。创建sougou_input目录,下载搜狗输入法安装文件放入该目录。创建一个au3脚本#......
  • Django国际化与本地化指南
    title:Django国际化与本地化指南date:2024/5/1216:51:04updated:2024/5/1216:51:04categories:后端开发tags:Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化引言在数字化时代,网站和应用程序必须跨越地域限制,服务于全球用户。这就是国际化......
  • 云服务器基本操作指南
    目录CentOS7.9服务器操作CentOS7.9服务器操作查看防火墙运行状态firewall-cmd--state开启防火墙sudosystemctlstartfirewalld开机自启动防火墙sudosystemctlenablefirewalld查看防火墙开放端口sudofirewall-cmd--list-ports添加防火墙开放端口firewal......
  • Vue.js的Vue@Cli入门指南
    Vue.js是一款流行的JavaScript框架,它使得构建交互式的Web界面变得简单和快捷。Vue@Cli是Vue.js官方提供的脚手架工具,它能够帮助我们快速搭建Vue.js项目,并提供了丰富的功能和插件。准备工作在开始之前,确保您已经安装了node.js和npm。然后,您可以通过以下命令安装Vue@Cli:npminsta......
  • 洛谷题单指南-动态规划3-Zuma
    原题链接:https://www.luogu.com.cn/problem/CF607B题意解读:从一组整数中取连续的回文子串,求最少几次可以取完。解题思路:状态表示:设dp[i][j]表示取i~j之间的回文子串所需的最少次数,a[i]表示第i个数状态转移:如果a[i]==a[j],dp[i][j]=dp[i+1][j-1],因为首尾如果相等,其必然可以......