[APIO2008]DNA 题解
首先呢,看到 A C G T 对应不同的权值,第一步就是把字母转换成数字。
我们分别对 A->1 C->2 G->3 T->4 进行标号,之后方便 \(\text{dp}\) 。
然后看到题目中对于一个范式的定义:
一个DNA序列属于范式 \(-j(j>1)\) ,只要它属于范式 \(-(j-1)\) 或者是一个范式 \(-(j-1)\) 和一个范式 \(-1\) 的连接。
那我看了半天才看懂是什么意思,简洁来说就是范式为 \(j\) 的串同时也是范式为 \(j+1\) 的串。
其实讲到现在也就是表达一个前缀和的关系。
那我们显然要把前缀和拆开,这样的话更利于我们 \(\text{dp}\) 转移。
用符合题目的思路来说就是:隔断 \(j\) 到 \(j+1\) 这两个范式之间的直升关系。
最后再做一遍前缀和恢复就好了。
考虑怎么 \(\text{dp}\) 。
我们设 \(f_{i,j,k}\) 表示到了第 \(i\) 个位置,当前位是 \(k\) ,且范式为 \(j\) 的方案数。
那么可以得到
\]
这个也很好理解吧。
就是说我从后向前转移,枚举后一位的优先级 \(type\) 。
如果当前的优先级 \(k\) 大于后一位的优先级 \(type\) 那么范式一定加一。
这也就是为什么转移方程中会出现 \(j-[k > type]\) 。
转移完成后要记得做一次前缀和。
具体细节可以看代码。
既然 \(f_{i,j,k}\) 都求出来了,那么输出方案也不难了。
对于 \(r\) 比当前方案数多时,那就增加当前的等级,并更新 \(r\) 。
Code
#include <cstdio>
#include <iostream>
#include <algorithm>
#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define quad putchar(' ')
#define Enter putchar('\n')
#define int long long
const int N = 5e4 + 5;
int m, k, r, a[N], f[N][15][5];
char c[N];
inline void print(int num) {
if (num == 1) putchar('A');
if (num == 2) putchar('C');
if (num == 3) putchar('G');
if (num == 4) putchar('T');
}
signed main(void) {
// file("P3624");
std::cin >> m >> k >> r;
scanf("%s", c + 1);
for (int i = 1; i <= m; i++) {
if (c[i] == 'A') a[i] = 1;
if (c[i] == 'C') a[i] = 2;
if (c[i] == 'G') a[i] = 3;
if (c[i] == 'T') a[i] = 4;
}
if (a[m] != 0) {
f[m][1][a[m]] = 1;
} else {
for (int i = 1; i <= 4; i++)
f[m][1][i] = 1;
}
for (int i = m - 1; i >= 1; i--) {
if (a[i] != 0) {
for (int j = 1; j <= k; j++) {
for (int l = 1; l <= 4; l++)
f[i][j][a[i]] += f[i + 1][j - (a[i] > l)][l];
}
} else {
for (int num = 1; num <= 4; num ++) {
for (int j = 1; j <= k; j++) {
for (int l = 1; l <= 4; l++)
f[i][j][num] += f[i + 1][j - (num > l)][l];
}
}
}
}
for (int i = 1; i <= m; i++)
for (int j = 1; j <= k; j++)
for (int l = 1; l <= 4; l++)
f[i][j][l] += f[i][j - 1][l];
int last = 0;
for (int i = 1; i <= m; i++) {
if (a[i] != 0) {
print(a[i]);
if (a[i] < last) k --;
last = a[i];
} else {
int chose;
for (chose = 1; chose <= 4 && r > f[i][k - (chose < last)][chose]; chose ++)
r -= f[i][k - (chose < last)][chose];
print(chose);
if (chose < last) k --;
last = chose;
}
}
std::cout << std::endl;
return 0;
}
[APIO2008]DNA 题解的更多相关文章
- 4606: [Apio2008]DNA
4606: [Apio2008]DNA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 63 Solved: 36[Submit][Status][D ...
- 【BZOJ4606】[Apio2008]DNA DP
[BZOJ4606][Apio2008]DNA Description 分析如DNA序列这样的生命科学数据是计算机的一个有趣应用.从生物学的角度上说,DNA 是一种由腺嘌呤.胞嘧啶.鸟嘌呤和胸腺嘧啶这 ...
- 洛谷3763:[TJOI2017]DNA——题解
https://www.luogu.org/problemnew/show/P3763 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是 ...
- bzoj 4606: [Apio2008]DNA【dp】
写题五分钟读题两小时系列-- 看懂题的话不算难,然而我去看了大佬的blog才看懂题-- 题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k ...
- [APIO2008]DNA
https://zybuluo.com/ysner/note/1158123 题面 戳我 解析 我们要求出第\(r\)种方案,莫过于看其前面什么时候有\(r-1\)种方案. 于是,我们要求出每种情况的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- HDU1560 DNA sequence(IDA*)题解
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 题解【loj537】「LibreOJ NOIP Round #1」DNA 序列
题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关 ...
- Leetcode:Repeated DNA Sequences详细题解
题目 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: " ...
随机推荐
- Linux的软件安装tomcat 以及jdk
因为tomcat的启动需要jdk,所以我们先安装jdk,安装完成后再安装tomcat 具体的文件大家可以到官网下载,下面介绍安装步骤 目录 jdk安装 1.通过xftp或者其他方式将安装包传到我们的L ...
- 关于Swagger优化
背景 尽管.net6已经发布很久了,但是公司的项目由于种种原因依旧基于.net Framework.伴随着版本迭代,后端的api接口不断增多,每次在联调的时候,前端开发叫苦不迭:"小胖,你们 ...
- CentOS Nginx的安装与部署
安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc ...
- CNN-Backbone的Pytorch实现
创建日期: 2020-07-04 17:19:39 简介:卷积神经网络非常适合处理图像相关任务,其优势一是权值共享策略,降低了模型复杂度和参数量,本质上也对应着生物视觉神经的感受野.二是其强大的特征提 ...
- 前端面试 -HTTP系列
http和https 的区别? 端口 经济 安全性 响应速度 http 80端口 不需要 明文传输,安全性差 页面响应速度快,使用tcp的3次握手 https 443端口 费钱SSL需要ca 证书 S ...
- vue - Vue脚手架/TodoList案例
今天做了一个案例,可以好好做做能够将之前的内容结合起来,最主要的是能对组件化编码流程有一个大概的清晰认知,这一套做下来,明天自己再做一遍复习一下,其实组件化流程倒是基本上没什么问题了,主要是很多vue ...
- 腾讯tbs 内存泄露
一.背景 TBS(腾讯浏览服务)是腾讯提供的移动端webview体验的整套解决方案(https://x5.tencent.com/docs/index.html),可以用于移动端加载doc.xls.p ...
- 电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析)
电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析) 目录 电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析) 写在前面 正文 电机噪声 谐波的产生 什么 ...
- 万字长文,带你轻松学习 Spark
大家好,我是大D. 今天给大家分享一篇 Spark 核心知识点的梳理,对知识点的讲解秉承着能用图解的就不照本宣科地陈述,力求精简.通俗易懂.希望能为新手的入门学习扫清障碍,从基础概念入手.再到原理深入 ...
- Fail2ban 配置详解 监禁配置(jail.conf)
### # 包含配置 ### [INCLUDES] # after = # 在加载本配置文件之后再加载指定的独立配置文件. before = paths-debian.conf # 在加载本配置文件之 ...