【BZOJ5336】[TJOI2018]party(动态规划)

题面

BZOJ
洛谷

题解

这题好神仙啊。。。
考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j],f[i][j-1],f[i-1][j-1]+(A_i==B_j)\}\)
发现对于固定的\(i\)而言,随着\(j\)的增长,相邻的两个数之间的差不超过\(1\),因此直接考虑一个\(2^k\)的状态记录差分的结果。
那么设\(f[i][S]\)表示当前考虑到了第\(i\)位,\(LCS\)的\(dp\)的差分数组为\(S\)的方案数。转移的时候枚举放那个字母就好了。因为还有连续字符的限制,所以再加一维就没有问题了。
这里转移因为会涉及差分数组的修改,所以可以提前把差分数组的转移给预处理出来,
然后大力\(dp\)就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 1000000007
#define MAX 1010
char ch[20],QwQ[5]="NOI";
int f[2][1<<15][3],tr[1<<15][3],cnt[1<<15];
int n,k,ans[MAX];
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int dp[16],tmp[16];
int Get(int S,int c)
{for(int i=1;i<=k;++i)dp[i]=dp[i-1]+((S>>(i-1))&1);for(int i=1;i<=k;++i)if(QwQ[c]==ch[i])tmp[i]=dp[i-1]+1;else tmp[i]=max(dp[i],tmp[i-1]);int ret=0;for(int i=1;i<=k;++i)ret|=(tmp[i]-tmp[i-1])<<(i-1);return ret;
}
int main()
{scanf("%d%d",&n,&k);scanf("%s",ch+1);for(int i=0;i<1<<k;++i)for(int c=0;c<3;++c)tr[i][c]=Get(i,c);for(int i=0;i<(1<<k);++i)cnt[i]=cnt[i>>1]+(i&1);f[0][0][0]=1;for(int i=1,nw=1,pw=0;i<=n;++i,nw^=1,pw^=1){memset(f[nw],0,sizeof(f[nw]));for(int j=0;j<1<<k;++j)for(int p=0;p<3;++p)for(int c=0;c<3;++c){int np;if(c==0)np=1;else if(c==1)np=p==1?2:0;else if(c==2)np=p==2?3:0;if(np==3)continue;add(f[nw][tr[j][c]][np],f[pw][j][p]);}}for(int i=0;i<1<<k;++i)for(int c=0;c<3;++c)add(ans[cnt[i]],f[n&1][i][c]);for(int i=0;i<=k;++i)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/10449175.html

【BZOJ5336】[TJOI2018]party(动态规划)相关推荐

  1. BZOJ5336 TJOI2018 party 【状压DP】*

    BZOJ5336 TJOI2018 party Description 小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是N, O, I的字样.在会场上他收集到了K个奖章组成 ...

  2. 基础省选+NOI-第4部分 动态规划

    1.期望概率DP [整理]简单的数学期望和概率DP [整理]简单的数学期望和概率DP - nimphy - 博客园 期望&概率dp总结 期望&概率dp总结_十分残念的博客-CSDN博客 ...

  3. 省选+NOI 第一部分 动态规划DP

    期望概率DP [整理]简单的数学期望和概率DP [整理]简单的数学期望和概率DP - nimphy - 博客园 期望&概率dp总结 期望&概率dp总结_十分残念的博客-CSDN博客 期 ...

  4. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  5. dp套dp(动态规划)

    dp套dp 这是一个对于一类动态规划的计数问题的处理方法,问题常常是如果形式确定就可以直接dp,但是现在却要求满足某个要求的所有方案数,一般的处理方法就是一维负责增量构造,其他维度用来表示内部dp状态 ...

  6. 伍六七带你学算法 动态规划 ——不同路径

    力扣 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格 ...

  7. 由动态规划计算编辑距离引发的思考

    简单介绍 编辑距离算法: https://www.cnblogs.com/BlackStorm/p/5400809.html https://wizardforcel.gitbooks.io/the- ...

  8. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  9. 【动态规划】Part1

    1. 硬币找零 题目描述:假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. 分析:   dp [0] = 0            dp [1] = 1 + ...

  10. 2016.4.2 动态规划练习--讲课整理

    1.codevs1742 爬楼梯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小明家外面有一个长长的楼梯,共N阶.小明的腿 ...

最新文章

  1. 使用cnpm代替npm
  2. ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决
  3. Repository模式(转载)
  4. Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求
  5. java泛型视频教程_Java泛型快速教程
  6. Introduction to the Optimizer --cbo
  7. python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
  8. 画质评测|一次关于视频画质的探(zhǎn)讨(xiàn)
  9. python md5函数_python实现md5加密
  10. 单链表头插法和尾插法
  11. 中美线径对照表_导线截面与线径对照表
  12. 人人都是产品经理总结 第一章
  13. 3个重点,20个函数分析,浅析FFmpeg转码过程
  14. 台式计算机接口示意图,台式机硬盘接口_台式机硬盘接口图解
  15. 数据结构中的数学公式
  16. QT5.12.1 ARM开发环境搭建 并 移植到RK3399 ubuntu16.04系统运行【完整版】
  17. U3D性能优化之MeshBaker(带光照)
  18. 【语义分割系列:八】Segmentation 数据集 介绍下载论文
  19. 推荐几个不错的编程学习网站
  20. JAVA——文件操作(全)

热门文章

  1. 图形形状及颜色识别【Python大作业】
  2. 为什么当函数值为定值时,梯度垂直于等值面?
  3. python opencv 将白色底变成透明底
  4. mysql 复制 数据 表结构_MySQL复制表结构和表数据
  5. React中使用highcharts画玫瑰图
  6. 创客使用Fusion 360 - 制作模型
  7. CF卡镜像备份及恢复系统
  8. 算法题打卡-超人进化(剑指offer第一天)
  9. 计算机消极影响英语作文,大学英语作文:电脑游戏的危害
  10. Arduino开发板利用L298N电机驱动模块驱动直流电机