[APIO2008]DNA
https://zybuluo.com/ysner/note/1158123
题面
解析
我们要求出第\(r\)种方案,莫过于看其前面什么时候有\(r-1\)种方案。
于是,我们要求出每种情况的方案数。
设\(dp[s][m][n]\)表示第\(i-n\)个字母中,已分\(m\)段,第\(i\)个字母为s(\(s\in\{A,C,G,T\}\))字母的序号 的方案数。
状态转移方程易得:(其中\(l\)是下一个字母)
\(dp[j][k][i]+=dp[l][k-(j>l)][i+1]\)
为了下面运算方便,要对\(dp[s][m][n]\)求前缀和\(sum[s][m][n]=\sum_{i=1}^s dp[i][m][n]\)
然后就可以从前往后推了,若碰到的字母已知,看段数就可以了;
如果碰到的字母未知,枚举\(s=1...4\)的情况,如\(r>dp[s][m][n]\),说明第\(r\)个还在当前枚举字母情况的后面,继续枚举;否则,这一位就是当前枚举到的字母。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=1e5+100;
char s[N];
int m,k,a[N];
ll r,n,dp[5][15][N],sum[5][15][N];
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il void wri(re int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) wri(x/10);
putchar(x%10+'0');
}
int main()
{
n=gi();m=gi();r=gi();
scanf("%s",s+1);
fp(i,1,n)
if(s[i]=='A') a[i]=1;else if(s[i]=='C') a[i]=2;else if(s[i]=='G') a[i]=3;else if(s[i]=='T') a[i]=4;
if(a[n]) dp[a[n]][1][n]=1;
else fp(i,1,4) dp[i][1][n]=1;
fq(i,n-1,1)
fp(j,1,4)
if(!a[i]||a[i]==j)
fp(k,1,m)
fp(l,1,4)
dp[j][k][i]+=dp[l][k-(j>l)][i+1];
fp(i,1,4)
fp(j,1,n)
fp(k,1,m)
sum[i][k][j]=sum[i][k-1][j]+dp[i][k][j];
re int las=0;
fp(i,1,n)
if(a[i])
{
if(a[i]<las) --m;
las=a[i];
putchar(s[i]);
}
else
{
re int j;
for(j=1;j<=4&&r>sum[j][m-(j<las)][i];j++) r-=sum[j][m-(j<las)][i];
if(j==1) putchar('A');if(j==2) putchar('C');if(j==3) putchar('G');if(j==4) putchar('T');
if(j<las) --m;
las=j;
}
puts("");
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 是一种由腺嘌呤.胞嘧啶.鸟嘌呤和胸腺嘧啶这 ...
- [APIO2008]DNA 题解
题目链接 首先呢,看到 A C G T 对应不同的权值,第一步就是把字母转换成数字. 我们分别对 A->1 C->2 G->3 T->4 进行标号,之后方便 \(\text{d ...
- bzoj 4606: [Apio2008]DNA【dp】
写题五分钟读题两小时系列-- 看懂题的话不算难,然而我去看了大佬的blog才看懂题-- 题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [LeetCode] Repeated DNA Sequences 求重复的DNA序列
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- DNA解链统计物理
来源:Kerson Huang, Lectures on Statistical Physics and Protein Folding, pp 24-25 把双链DNA解开就像拉拉链.设DNA有\( ...
- AC自动机+DP HDOJ 2457 DNA repair(DNA修复)
题目链接 题意: 给n串有疾病的DNA序列,现有一串DNA序列,问最少修改几个DNA,能使新的DNA序列不含有疾病的DNA序列. 思路: 构建AC自动机,设定end结点,dp[i][j]表示长度i的前 ...
- [Leetcode] Repeated DNA Sequences
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
随机推荐
- 大白_uva10795_新汉诺塔
题意:给出所有盘子的初态和终态,问最少多少步能从初态走到终态,其余规则和老汉诺塔一样. 思路: 若要把当前最大的盘子m从1移动到3,那么首先必须把剩下的所有盘子1~m-1放到2上,然后把m放到3上. ...
- ADODB.Stream
读写文本文件时出现了乱码,找到了ADODB.Stream,可以指定字符集读取文本 Function ReadUTF() Filename = "F:\vba\2018 - new\2018- ...
- Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...
- 取textaera里的值
jQuery的.val()方法是专门用来获取表单元素值的,而textarea也属于表单元素所以可以直接用.val()方法获取. 不过要注意,由于textarea是个双标记因此.text()或.html ...
- 使用No-Conflict模式,其实就是对jQuery进行重命名,再调用。
<script type="text/javascript" src="/jquery/jquery.js"></script>< ...
- 使用Scrapy爬取图书网站信息
重难点:使用scrapy获取的数值是unicode类型,保存到json文件时需要特别注意处理一下,具体请参考链接:https://www.cnblogs.com/sanduzxcvbnm/p/1030 ...
- 网络编程:tcp、udp、socket、struct、socketserver
一.TCP.UDP 一.ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址. 二.在网络通信中 ...
- 【7】Django网页视图模板处理
天下难事必作於易.天下大事必作於细.是以圣人终不为大,故能成其大 --老子<道德经> 本节内容 HTML页面的渲染 使用页面模板 异常处理 超链接路径处理 路由命名空间 1. HTML页面 ...
- Python基础-画菱形
方法一 n = int(input('请输入:')) for i in range(1, n, 2): print(('*'*i).center(n)) for i in reversed(range ...
- vue轮播插件vue-awesome-swiper
https://surmon-china.github.io/vue-awesome-swiper/ 第一步安装 npm install vue-awesome-swiper --save 第二部在m ...