【BZOJ4606】[Apio2008]DNA DP

【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;
}
时间: 2024-11-15 05:11:21

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

【POJ】2278 DNA Sequence

各种wa后,各种TLE.注意若AC非法,则ACT等一定非法.而且尽量少MOD. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 105 8 #define NXTN 4 9 10 char str[15]; 11 12 typedef struct Matrix {

【LeetCode】Repeated DNA Sequences 解题报告

[题目] All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a function to find all the 10-letter-lon

【题解】剪纸条(dp)

[题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回文子串的最小数目 直接模拟题意转移即可.初始化写在里面了,\(dp(i)=i\) \[ dp(i)=\min\{i,dp(j-1)\} \] 其中\(S[j\dots i]\)是一个回文串,\(O(n^2)\)预处理回文串即可,注意偶回文串和奇回文串. 刚开始想太多,这道题.以后遇最优化的题一定要花

【递归】油桶问题dp

问题 : [递归]油桶问题 题目描述 楚继光扬扬得意道:“当日华山论剑,先是他用黯然销魂掌破了我的七十二路空明拳,然后我改打降龙十八掌,却不防他伸开食指和中指,竟是六脉神剑,又胜我一筹.可见天下武学彼此克制,武学之道玄之又玄!……哎,谁用炒锅敲我头?” 楚继光的老妈大声骂道:“玩个石头剪刀布都说得这般威风,炒菜没油了,快给我去装!” “这么凶干嘛?不就吹吹牛嘛.”楚继光边嘟嘟囔囔边走进储藏室,看到储藏室有N个油桶都装 满了油,这N个油桶容积各不相同(容积为整数),楚继光需要M升油(M也为整数),

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

1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Status][Discuss] Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实数.每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金

NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]

我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 73            测试通过 : 9 描述 热风哈罗哈(三牌楼)店正在搞活动:他们将提供一个大披萨给第一个告诉他们以下信息的人:一次购买任一种披萨,哪种单位面积的价格最低.问题初步想一想,好像是这么解决:“对于每个披萨计算平均

【BZOJ3329】Xorequ 数位DP+矩阵乘法

[BZOJ3329]Xorequ Description Input 第一行一个正整数,表示数据组数据 ,接下来T行每行一个正整数N Output 2*T行第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, Sample Input 1 1 Sample Output 1 2 HINT x=1与x=2都是原方程的根,注意第一个问题的解不要mod 10^9+7 1<=N<=10^18 1<=T<=1000 题解:由于x*3中一位最多只会改动3位,所以我

NOJ 1118 玻璃球 【深蓝】[状态压缩DP]

玻璃球 [深蓝] 时间限制(普通/Java) : 10000 MS/ 30000 MS 运行内存限制 : 65536 KByte总提交 : 57            测试通过 : 11 比赛描述 玩过玻璃球游戏吗?sed同学小学没有毕业之前玩过,他常常用一个直径为d的圆柱管来装玻璃球,已知每个玻璃球是半径为 r1, r2, . . . , rn的球体,他当时一直有一个疑问:装这些玻璃球最少需要多长的圆柱管.现请你帮他解决这个问题. 假设玻璃球半径充分大,以至于管中不存在三个可以同时相互接触的玻

NOJ 1116 哈罗哈的大披萨 【淡蓝】 状态压缩DP

哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 99            测试通过 : 14 比赛描述 热风哈罗哈(三牌楼)店正在搞活动:他们将提供一个大披萨给第一个告诉他们以下信息的人:一次购买任一种披萨,哪种单位面积的价格最低.问题初步想一想,好像是这么解决:"对于每个披萨计算平均价格,那么最小值就是答案了." 但是,这个问题不是这么简单,因为在热风哈罗哈店里:对某些披萨,是送打折优惠