bzoj千题计划241:bzoj3864: Hero meet devil
http://www.lydsy.com/JudgeOnline/problem.php?id=3864
题意:
给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2....
求LCS方式:f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]*(s[i]==t[j]))
固定了i,相邻的j的f[i][j]值最多相差1
dp[i][j] 表示长度为i的DNA序列,将“f[ |S| ][j+1]是否比f[ |S| ][j] 大1” 这个状态压缩为j的方案数
若我们知道 状态j加上一个字母k可以到状态nxt[j][k]
那么dp[i+1][nxt[j][k]]+=dp[i][j]
关键是如何求得nxt[j][k]
再一次DP
枚举所有的状态i
令f[j] 表示加上字母k之前的LCS长度,g[j]表示加上字母k之后的LCS长度
g[j]=max(g[j-1],f[j])
如果加上的字母k和原序列第j个字母匹配 g[i]=max(g[j],f[j-1]+1)
g求完后,项邻的两个g要么相等,要么相差1
再把这个状态压缩起来即可
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int mod=1e9+; int m; char ss[];
int L,S;
int s[]; int ch[]; int f[],g[];
int nxt[<<][]; int dp[][<<];
int ans[]; void pre()
{
int len; int c[];
for(int i=;i<S;++i)
{
memset(f,,sizeof(f));
for(int j=;j<=L;++j) f[j]=f[j-]+(i>>j-&);
for(int k=;k<;++k)
{
for(int j=;j<=L;++j)
{
g[j]=max(g[j-],f[j]);
if(s[j]==k) g[j]=max(g[j],f[j-]+);
}
nxt[i][k]=;
for(int j=;j<L;++j)
if(g[j+]-g[j]) nxt[i][k]+=<<j;
}
}
} int count(int x)
{
int sum=;
while(x)
{
sum+=x&;
x>>=;
}
return sum;
} void DP()
{
memset(dp,,sizeof(dp));
int now=,last=;
dp[][]=;
for(int i=;i<=m;++i)
{
memset(dp[now],,sizeof(dp[now]));
for(int j=;j<S;++j)
for(int k=;k<;++k)
{
dp[now][nxt[j][k]]+=dp[last][j];
dp[now][nxt[j][k]]-=dp[now][nxt[j][k]]>=mod ? mod : ;
}
swap(now,last);
}
memset(ans,,sizeof(ans));
int t;
for(int i=;i<S;++i)
{
t=count(i);
ans[t]+=dp[last][i];
ans[t]-=ans[t]>=mod ? mod : ;
}
for(int i=;i<=L;++i) printf("%d\n",ans[i]);
} int main()
{
ch['A'-'A']=;
ch['C'-'A']=;
ch['G'-'A']=;
ch['T'-'A']=;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",ss+);
scanf("%d",&m);
L=strlen(ss+);
S=<<L;
for(int i=;i<=L;++i) s[i]=ch[ss[i]-'A'];
pre();
DP();
}
return ;
}
bzoj千题计划241:bzoj3864: Hero meet devil的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- wkhtmltopdf 参数介绍
wkhtmltopdf [OPTIONS]... <input file> [More input files] <output file> 常规选项 --allow &l ...
- Asp.Net_Mvc3.5语法_<%%>的用法
一. <%%>这种格式实际上就是和asp的用法一样的,只是asp中里面是vbscript或 者javascript代码,而在asp.net中用的是.net平台下支持的语言.特别 注意:服务 ...
- Git提交空目录
1.git仅跟踪文件的变动,不跟踪目录.如果需要提交空目录,可以在里面添加 .gitignore 文件,方法如下: find . -type d -empty -exec touch {}/.giti ...
- 前端开发工具icestar
前端开发工具icestar 最近忙里偷闲,把之前的mock工具进行了全面的重构,最大的改变就是换了个名称icestar,icestar意思就是"爱死他",首先他的预想并不只是替代m ...
- CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
一.说明 本文为系列博客第二篇,主要讲述笔者在使用该团队提供已经标注好的COCO数据集进行训练的过程. 由于在windows中编译Caffe和Deeplab特别的麻烦,笔者并没有去探索,后续可能会去尝 ...
- Kali信息收集-搜索引擎
1.google hacking intext:搜索正文内容 intitile:网页标题中的内容 inurl:url中的关键字 site:目标站点下 filetype:文件类型 cache:缓存 li ...
- PAT甲题题解-1071. Speech Patterns (25)-找出现最多的单词
分割字符串的用法+map映射给出input中出现次数最多的单词,如果次数相同,给出按字典序最小的. 这里我用了自定义分隔符来读取字符串,方法如下: //按照定义的分隔符d来分割字符串,对str进行读取 ...
- 《Linux内核分析》第四周学习笔记
<Linux内核分析>第四周学习笔记 扒开系统调用的三层皮(上) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- YQCB冲刺第二周第三天
今天的任务依旧查看消费明细的功能. 遇到的问题为显示消费记录时显示所有用户的消费记录. 站立会议 任务面板
- Daily Scrum - 12/04
Meeting Minutes 与Qiufeng, Bojie, Zhongqiu, Ran, Travis一起讨论. 确定了最后的UI及Feature. 开始Code Review, 以及有计划的M ...