【BZOJ4606】[Apio2008]DNA

Description

分析如DNA序列这样的生命科学数据是计算机的一个有趣应用。从生物学的角度上说,DNA 是一种由腺嘌呤、胞嘧啶、鸟嘌呤和胸腺嘧啶这四种核苷酸组成的链式结构。这四种核苷酸分别用大写字母A、C、G、T表示。这样,一条DNA单链可以被表示为一个只含以上四种字符的字符串。我们将这样的字符串称作一个DNA序列 。有时生物学家可能无法确定一条DNA单链中的某些核苷酸。在这种情况下,字符N将被用来表示一个不确定的核苷酸。换句话说,N可以用来表示A、C、G、T中的任何一个字符。我们称包含一个或者多个N的DNA序列为未完成序列;反之,就称作完成序列。
如果一个完成序列可以通过将一个未完成序列中的每个N任意替换成A、C、G、T得到的话,就称完成序列适合这个未完成序列。举例来说,ACCCT适合ACNNT,但是AGGAT不适合。研究者们经常按照如下方式排序四种核苷酸:A优先于C,C优先于G,G优先于T。如果一个DNA序列中的每个核苷酸都与其右边的相同或者优先,就将其归类为范式-1。举例来说,AACCGT是范式-1,但是AACGTC不是。一般来说,一个DNA序列属于范式-j(j>1),只要它属于范式-(j-1)或者是一个范式-(j-1)和一个范式-1的连接。举例来说,AACCC、ACACC和ACACA都是范式-3,但GCACAC和ACACACA不是。同样,研究者们按照字典序对 DNA 序列进行排序。按照这个定义,最小的属于范式-3的DNA序列是AAAAA,最大的是TTTTT。这里是另外一个例子,考虑未完成序列 ACANNCNNG。那么前7个适合这个未完成序列的DNA序列是:
ACAAACAAG
ACAAACACG
ACAAACAGG
ACAAACCAG
ACAAACCCG
ACAAACCGG
ACAAACCTG
写一个程序,找到按字典序的第R个适合给定的长度为M的未完成序列的范式-K。

Input

输入第一行包含三个由空格隔开的整数:M(1≤M≤50,000),K(1≤K≤10)和R(1≤R≤2×10^12)。
第二行包含一个长度为M的字符串,表示未完成序列。
保证适合该未完成序列的范式-K的总数不超过4×10^18 
因此该数可以用C和C++中的long long类型或者Pascal中的Int64类型表示。
同时,R不会超过适合给定未完成序列的范式-K的总数。

Output

在第一行中输出第R个适合输入中的未完成序列的范式-K。

Sample Input

9 3 5
ACANNCNNG

Sample Output

ACAAACCCG

题意:我们定义一个串的范式=最少能将该串分成多少个连续的段,满足每段都是单调不降的(A<C<G<T)。现用A,C,G,T替换原串中的N,求在所有可能得到的串中,第R小的,范式<=K的串。

题解:感觉思路和数位DP好像。

先倒着DP,令f[i][j][k]表示后i位,范式=k,且第i位是j的串的个数。转移比较简单。最后我们再正着统计一遍。如果第i位=j时方案数<ans,就令ans-=方案数,并枚举j+1。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=50010;
typedef long long ll;
ll R;
int n,m;
int v[maxn];
ll f[maxn][4][10];
char str[maxn];
int main()
{
scanf("%d%d%lld%s",&n,&m,&R,str),m--;
int i,j,k,l;
for(i=1;i<=n;i++)
{
switch(str[i-1])
{
case 'A': v[i]=0; break;
case 'C': v[i]=1; break;
case 'G': v[i]=2; break;
case 'T': v[i]=3; break;
case 'N': v[i]=-1; break;
}
}
f[n+1][3][0]=1;
for(i=n;i>=1;i--)
{
for(j=0;j<4;j++) if(v[i]==-1||v[i]==j) for(k=0;k<=m;k++)
{
for(l=j;l<4;l++) f[i][j][k]+=f[i+1][l][k];
if(k) for(l=0;l<j;l++) f[i][j][k]+=f[i+1][l][k-1];
}
}
for(i=1;i<=n;i++)
{
for(j=0;j<4;j++) for(k=1;k<=m;k++) f[i][j][k]+=f[i][j][k-1];
for(j=0;j<4;j++)
{
ll tmp;
if(j<v[i-1]) tmp=f[i][j][m-1];
else tmp=f[i][j][m];
if(R>tmp) R-=tmp;
else break;
}
v[i]=j;
if(v[i]<v[i-1]) m--;
switch(v[i])
{
case 0: str[i-1]='A'; break;
case 1: str[i-1]='C'; break;
case 2: str[i-1]='G'; break;
case 3: str[i-1]='T'; break;
case -1: str[i-1]='N'; break;
}
}
printf("%s",str);
return 0;
}

【BZOJ4606】[Apio2008]DNA DP的更多相关文章

  1. 【LeetCode】Repeated DNA Sequences 解题报告

    [题目] All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &quo ...

  2. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  3. 【题解】剪纸条(dp)

    [题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...

  4. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  5. 【5】肿瘤DNA甲基化数据分析原理及流程

    目录 导论 DNA甲基化基本概论 检测DNA甲基化的方法 DNA甲基化数据分析流程及方法 DNA甲基化在肿瘤研究中的应用 导论 表观遗传:非DNA决定的基因表达,或表型改变中可遗传因素的研究 DNA水 ...

  6. 【BZOJ-1068】压缩 区间DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1001  Solved: 615[Submit][Status][ ...

  7. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Sta ...

  8. 【递归】油桶问题dp

    问题 : [递归]油桶问题 题目描述 楚继光扬扬得意道:“当日华山论剑,先是他用黯然销魂掌破了我的七十二路空明拳,然后我改打降龙十八掌,却不防他伸开食指和中指,竟是六脉神剑,又胜我一筹.可见天下武学彼 ...

  9. 【HDU3247】 Resource Archiver(DP+AC自动机+最短路)

    Resource Archiver Time Limit: 10000MS   Memory Limit: 100000KB   64bit IO Format: %I64d & %I64u ...

随机推荐

  1. 了解C#文件操作

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  2. Js/jQuery实时监听输入框值变化

    前言 在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能 ...

  3. php 不等待返回的实现方法(异步调用)

    PHP异步执行的常用方式常见的有以下几种,可以根据各自优缺点进行选择: 1.客户端页面采用AJAX技术请求服务器优点:最简单,也最快,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一 ...

  4. location 禁止以/data开头的文件

    [root@web01 default]# tree data/ data/ └── index.html directories, file [root@web01 default]# cat da ...

  5. vue 的调试工具

    转载自:http://www.cnblogs.com/lolDragon/p/6268345.html 安装 1.github下载地址:https://github.com/vuejs/vue-dev ...

  6. 在无法单步调试的情况下找Bug的技巧

    比如说你有一个大的模块A,其组成部分有B,C,D这3个小的模块,现在A出了一个BUG,因为某种原因的限制你无法单步调试.怎么较快地定位BUG发生的根源? 这里记录一下刚才我在找BUG的时候采用的思路, ...

  7. 示例 - 如何在多线程中应用SpiderStudio生成的DLL?

    >> 接上文 "示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?", 将其改成多线程: 代码: using System; using ...

  8. C++ 类的继承二(赋值兼容性原则)

    //赋值兼容性原则 #include<iostream> using namespace std; class PointA{ public: PointA(){ x = ; y = ; ...

  9. malloc 函数本身并不识别要申请的内存是什么类型

    malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数.我 们通常记不住 int, float 等数据类型的变量的确切字节数. 例如 int 变量在 16 位系统 下是 2 个字 ...

  10. [转载]Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试 -2

    自己的代码 import unittest # import HTMLTestRunner_cn as HTMLTestRunner import xmlrunner import sys sys.p ...