【BZOJ5336】【TJOI2018】party
【题目链接】
- 点击打开链接
【思路要点】
- 考虑最长公共子序列的DP数组,它的每一行只有\(O(K)\)个数,并且相邻两数只差在1以内。
- 因此,我们可以将每一行压为一个在\(2^K\)以内的二进制数。
- 预处理每个状态的后续状态,简单DP即可。
- 需要滚动数组,时间复杂度\(O(N*2^K)\)。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXK = 20; const int MAXN = 1005; const int MAXS = 32768; const int P = 1e9 + 7; template <typename T> void chkmax(T &x, T y) {x = max(x, y); } template <typename T> void chkmin(T &x, T y) {x = min(x, y); } template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f; } template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0'); } template <typename T> void writeln(T x) {write(x);puts(""); } int n, m, bit[MAXK]; int dest[MAXS][3]; int dp[2][3][MAXS], ans[MAXK]; char st[MAXK]; void update(int &x, int y) {x += y;if (x >= P) x -= P; } int main() {read(n), read(m);scanf("\n%s", st + 1);for (int i = 1; i <= m; i++)bit[i] = 1 << (i - 1);dp[0][0][0] = 1;int goal = (1 << m) - 1;for (int s = 0; s <= goal; s++) {static int now[MAXK];for (int i = 1; i <= m; i++)now[i] = now[i - 1] + ((bit[i] & s) != 0);static int res[MAXK];for (int i = 1; i <= m; i++) {if (st[i] == 'N') res[i] = now[i - 1] + 1;else res[i] = max(res[i - 1], now[i]);dest[s][0] |= (res[i] - res[i - 1]) * bit[i];}for (int i = 1; i <= m; i++) {if (st[i] == 'O') res[i] = now[i - 1] + 1;else res[i] = max(res[i - 1], now[i]);dest[s][1] |= (res[i] - res[i - 1]) * bit[i];}for (int i = 1; i <= m; i++) {if (st[i] == 'I') res[i] = now[i - 1] + 1;else res[i] = max(res[i - 1], now[i]);dest[s][2] |= (res[i] - res[i - 1]) * bit[i];}}for (int i = 1, now = 1, from = 0; i <= n; i++, swap(now, from)) {memset(dp[now], 0, sizeof(dp[now]));for (int s = 0; s <= goal; s++) {update(dp[now][1][dest[s][0]], dp[from][0][s]);update(dp[now][0][dest[s][1]], dp[from][0][s]);update(dp[now][0][dest[s][2]], dp[from][0][s]);update(dp[now][1][dest[s][0]], dp[from][1][s]);update(dp[now][2][dest[s][1]], dp[from][1][s]);update(dp[now][0][dest[s][2]], dp[from][1][s]);update(dp[now][1][dest[s][0]], dp[from][2][s]);update(dp[now][0][dest[s][1]], dp[from][2][s]);}}int now = n & 1;for (int i = 0; i <= 2; i++)for (int s = 0; s <= goal; s++) {int cnt = 0, tmp = s;while (tmp != 0) {cnt++;tmp -= tmp & -tmp;}update(ans[cnt], dp[now][i][s]);}for (int i = 0; i <= m; i++)writeln(ans[i]);return 0; }
【BZOJ5336】【TJOI2018】party相关推荐
- 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)
本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- 【C++自我精讲】基础系列二 const
[C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...
- (四)Asp.net web api中的坑-【api的返回值】
(四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...
- 【C++】【九】栈的应用
[C++][九]栈的应用 就近匹配原理及其步骤: 中缀转后缀:
- 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...
@(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...
- (10)Spring Boot修改端口号【从零开始学Spring Boot】
Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...
- 【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...
实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. 我将开源我的学习方 ...
- 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅
这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...
- 【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...
@(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,, 每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后 ...
最新文章
- SQL 解决从分组数据中总是挑选第一条数据的问题
- python语言及其应用-python语言及其应用
- 初学laravel migrate常见错误解决
- Hibernate 多对多映射实列
- 数据挖掘应用现状与产品分析
- c++从零实现神经网络
- 废芯片做出来的艺术品!值得一看!
- Repeater嵌套绑定Repeater
- pandas之cut
- Netty技术细节源码分析-FastThreadLocal源码分析
- mysql创建复杂表_数据库_MySQL_复杂的表结构创建
- 算法学习--二叉查找树
- [转载] np.logical_and用法(有代码)
- java list 排序_java 对list进行排序
- 用友 NC客户化开发手册
- 大学计算机进制与转换教案,《进制转换》教案
- element-ui Dialog 对话框可拖拽
- 知识图谱在小米的应用与探索
- Java如何调用芝麻信用分?
- 几张表格怎么联动_在excel 中,怎样实现数据关联?:excel怎么把几个表格的数据联动...