BZOJ5336 TJOI2018 party 【状压DP】*
BZOJ5336 TJOI2018 party
Description
小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是N, O, I的字样。在会场上他收集到了K个奖章组成的串。
兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。
现在已知兑奖串长度为N,并且在兑奖串上不会出现连续三个奖章为NOI,即奖章中不会出现子串NOI。
现在小豆想知道各个奖励等级会对应多少个不同的合法兑奖串。
Input
第一行两个数,N,K分别代表兑奖串的长度,小豆收集的奖章串的长度。
第二行一共K个字符,表示小豆得到奖章串。
N<=1000 & K<=15
Output
一共K+1行,第i行表示小豆最后奖励等级为i-1的不同的合法兑奖串的个数,可能这个数会很大,结果对10^9 + 7取模。
Sample Input
3 2
NO
Sample Output
1
19
6
提示
最长公共子序列长度0的串有:III;
最长公共子序列长度2的串有:NON, NNO, NOO, ONO,INO, NIO;
除去NOI,余下的19(26-6-1)种为最长公共子序列长度为1。
我们发先在对lsm进行计算的时候相邻两个DP值的差最多是一,所以我们借此进行状态构造。把一个dp值差分后的01串作为状态,然后对这个状态进行DP,因为我们需要考虑的特殊情况只有NOI,所以添加一维记一下状态就好了
#include<bits/stdc++.h>
using namespace std;
#define K 20
#define N 1010
#define S (1<<16)
#define Mod 1000000007
int n,k,bit[K],ans[K]={0};
int now[K]={0},res[K]={0},a[K];
int T[S][3]={0};
int dp[2][3][S]={0},ind=0,frm=1;
/*
dp数组中第二维
0->没有特殊限制
1->末尾是N
2->末尾是NO
*/
/*
N->0
O->1
I->2
*/
void add(int &x,int y){x=(x+y)%Mod;}
int countsiz(int s){int cnt=0;while(s)cnt++,s-=s&-s;return cnt;}
int main(){
scanf("%d%d",&n,&k);
getchar();
for(int i=1;i<=k;i++){
char c;scanf("%c",&c);
if(c=='N')a[i]=0;
if(c=='O')a[i]=1;
if(c=='I')a[i]=2;
}
bit[1]=1;for(int i=2;i<=k;i++)bit[i]=bit[i-1]<<1;
int up=(1<<k)-1;
for(int s=0;s<=up;s++){
for(int i=1;i<=k;i++)
now[i]=now[i-1]+(bool)(s&bit[i]);
for(int typ=0;typ<3;typ++){
for(int i=1;i<=k;i++)
if(a[i]==typ)res[i]=now[i-1]+1;
else res[i]=max(res[i-1],now[i]);
for(int i=1;i<=k;i++)T[s][typ]|=bit[i]*(res[i]-res[i-1]);
}
}
dp[ind][0][0]=1;
for(int i=1;i<=n;i++){
ind^=1;frm^=1;
memset(dp[ind],0,sizeof(dp[ind]));
for(int s=0;s<=up;s++){
//没有限制->没有限制(当前出现O或I)
add(dp[ind][0][T[s][1]],dp[frm][0][s]);
add(dp[ind][0][T[s][2]],dp[frm][0][s]);
//没有限制->限制1(当前出现N)
add(dp[ind][1][T[s][0]],dp[frm][0][s]);
//限制1->没有限制(当前出现I)
add(dp[ind][0][T[s][2]],dp[frm][1][s]);
//限制1->限制1(当前出现N)
add(dp[ind][1][T[s][0]],dp[frm][1][s]);
//限制1->限制2(当前出现O)
add(dp[ind][2][T[s][1]],dp[frm][1][s]);
//限制2->没有限制(当前出现O)
add(dp[ind][0][T[s][1]],dp[frm][2][s]);
//限制2->限制1(当前出现N)
add(dp[ind][1][T[s][0]],dp[frm][2][s]);
}
}
for(int s=0;s<=up;s++)
for(int i=0;i<3;i++)
add(ans[countsiz(s)],dp[ind][i][s]);
for(int i=0;i<=k;i++)printf("%d\n",ans[i]);
return 0;
}
BZOJ5336 TJOI2018 party 【状压DP】*的更多相关文章
- 洛谷P4590 [TJOI2018]游园会(状压dp LCS)
题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
随机推荐
- Swoft 快速上手小贴士
IDE一定要装注解插件PHP Annotations Request和Response里的with...开头的方法会clone $this, 而不是修改本实体, 所以设置Cookie之类的时候要$re ...
- 用svg实现不规则形状
像这种弧形,用纯html和css很难写,但是用svg就简单多了. 可以用作图工具画出一个弧形,然后导成svg格式.在页面中,下面的白块就是div+svg构成 mixin svgCard(...cont ...
- spring mvc:练习:javaConfig配置和注解
Spring4 MVC HelloWorld 注释/JavaConfig为示例,一步一步以简单的方式学习Spring4 MVC 的注解,项目设置,代码,部署和运行. 我们已经使用XML配置开发了一个H ...
- WPF应用的一些小总结(模板、样式,上下文)
1: 后台:XXX.DataContext = ViewModel(数据对象)(XXX可以是当前的UserControl.Windows.Grid.TextBlock.Lable等UI控件,选择不同的 ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...
- 设计模式--迭代器模式C++实现
迭代器模式C++实现 1定义 他提供一种方法访问一个容器对象中的各个元素,而不暴漏该对象内部细节 注:迭代器是为容器服务的.迭代器模式提供了遍历容器的方便性,容器只管理增减元素就好,需要遍历时交给迭代 ...
- 常用的SpringMVC注解
1.@RequestMapping() 访问链接编写: 例如: (1).请求方法: 访问链接: (2).请求参数和请求头: 访问链接: 2.@PathVariable 例如: 访问链接: 结果显示: ...
- 收集的几个好用的maven mirror
<mirrors> <mirror> <id>jboss-public-repository-group</id> <mirrorOf>ce ...
- debug调试日志和数据查询
手动删除es文件并释放磁盘空间 1.停掉服务 systemctl stop xsdaemon.service 2.删掉索引 rm -rf /home/storager/c3dceb5e-bacc-4a ...
- 那如何判断页面是在移动端还是PC端打开的
网上有很多方法,写的或难或简单,实际上一行代码就够了. window.location.href = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navi ...