bzoj 4606: [Apio2008]DNA【dp】
写题五分钟读题两小时系列……
看懂题的话不算难,然而我去看了大佬的blog才看懂题……
题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k段就能使每一段字典序单调不降。求在所有合法串中字典序第r大的。
设f[i][j][k]表示第i个字符选j,至少需要分成k段的方案数,倒着dp,特判一下通配符,比较基础懒就不多说了
然后对于每个f[i][j],把k维变成前缀和的形式,因为能分为k段就能分为k+1段。(这里其实当i<k的时候是不对的,但是我写的时候没有特判也过了就没改= =)
然后正着算答案,有点像splay上求k大数的感觉,就是一边匹配一边把r减去当前方案之前(字典序小于当前方案)的方案数。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=50005;
int n,m,a[N],h[305];
long long r,ans,f[N][5][15];
char s[N],b[5];
int main()
{
h['A']=0,h['C']=1,h['G']=2,h['T']=3,h['N']=4;
b[0]='A',b[1]='C',b[2]='G',b[3]='T';
scanf("%d%d%lld%s",&n,&m,&r,s+1);
for(int i=1;i<=n;i++)
a[i]=h[s[i]];
if(a[n]==4)
f[n][0][1]=1,f[n][1][1]=1,f[n][2][1]=1,f[n][3][1]=1;
else
f[n][a[n]][1]=1;
for(int i=n-1;i>=1;i--)
{
if(a[i]==4)
{
for(int j=0;j<=3;j++)
for(int k=1;k<=m;k++)
for(int l=0;l<=3;l++)
f[i][j][k]+=f[i+1][l][k-(j>l)];
}
else
{
for(int k=1;k<=m;k++)
for(int l=0;l<=3;l++)
f[i][a[i]][k]+=f[i+1][l][k-(a[i]>l)];
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<=3;j++)
for(int k=1;k<=m;k++)
f[i][j][k]+=f[i][j][k-1];
for(int i=1,j;i<=n;i++)
{
for(j=0;j<=3;j++)
{
long long sum;
if(j<a[i-1])
sum=f[i][j][m-1];
else
sum=f[i][j][m];
if(r>sum)
r-=sum;
else
break;
}
a[i]=j;
if(a[i]<a[i-1])
m--;
printf("%c",b[j]);
}
return 0;
}
bzoj 4606: [Apio2008]DNA【dp】的更多相关文章
- [BZOJ 1025] [SCOI2009] 游戏 【DP】
题目链接:BZOJ - 1025 题目分析 显然的是,题目所要求的是所有置换的每个循环节长度最小公倍数的可能的种类数. 一个置换,可以看成是一个有向图,每个点的出度和入度都是1,这样整个图就是由若干个 ...
- bzoj 4247: 挂饰【dp】
bzoj上访问负下标会跑到奇怪的地方-- 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i-1][j],f ...
- BZOJ 3039: 玉蟾宫【dp】
Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...
- bzoj 3830: [Poi2014]Freight【dp】
参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走 ...
- bzoj 4584: [Apio2016]赛艇【dp】
参考:https://www.cnblogs.com/lcf-2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数 ...
- 4606: [Apio2008]DNA
4606: [Apio2008]DNA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 63 Solved: 36[Submit][Status][D ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
随机推荐
- P1455 搭配购买
洛谷——P1455 搭配购买 题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商 ...
- java学习(4)——动手动脑
根据ppt所给的例子,运行的结果如下所示: ppt中出现的第二个动手动脑如下: 代码如下: 其运行结果如下: 作出简单的分析如下:有点类似于if 和else的关系,总是对应try和catch同层中的异 ...
- 简论远程通信(RPC,Webservice,RMI,JMS的区别)
RPC(Remote Procedure Call Protocol)RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成“cla ...
- SpringMVC get请求中文乱码
针对GET请求的编码问题,则需要改tomcat的server.xml配置文件,如下: 原 <Connector connectionTimeout="20000" port= ...
- IntelliJ IDEA14.0.3+Maven+SpringMVC+Spring+Hibernate光速构建Java权限管理系统(三)
注册登录 --利用简单的编写注册登录系统来打通从前端到后台的数据传输路径. 一.建立数据库.基本表 基本环境:mysql5,7.Navicat for MySQL11.0.9企业版. 我们在本地MyS ...
- topcoder srm 553
div1 250pt: 题意:... 解法:先假设空出来的位置是0,然后模拟一次看看是不是满足,如果不行的话,我们只需要关心最后栈顶的元素取值是不是受空白处的影响,于是还是模拟一下. // BEGIN ...
- NODE安装N管理出错
Windows不支持,反正我在Linux上用过,从此脱离Win坑!
- 异或巧用:Single Number
异或巧用:Single Number 今天刷leetcode,碰到了到题Single Number.认为解答非常巧妙,故记之... 题目: Given an array of integers, ev ...
- JS日历控件 灵活设置: 精确的时分秒.
在今年7月份时候 写了一篇关于 "JS日历控件" 的文章 , 当时仅仅支持 年月日 的日历控件,如今优化例如以下: 1. 在原基础上 支持 yyyy-mm-dd 的年月 ...
- 如何离线分析Kafka海量业务消息?1分钟快速为您支招
场景介绍 说起Kafka,许多使用者对它是又爱又恨.Kafka是一种分布式的.基于发布/订阅的消息系统,其极致体验让人欲罢不能,但操心的运维.复杂的安全策略.可靠性易用性的缺失等,仍需要使用者付出诸多 ...