【题目链接】

  • 点击打开链接

【思路要点】

  • 考虑最长公共子序列的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相关推荐

  1. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  2. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  3. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  4. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  5. 【C++】【九】栈的应用

    [C++][九]栈的应用 就近匹配原理及其步骤: 中缀转后缀:

  6. 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...

    @(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...

  7. (10)Spring Boot修改端口号【从零开始学Spring Boot】

    Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...

  8. 【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...

    实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. 我将开源我的学习方 ...

  9. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  10. 【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...

    @(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,, 每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后 ...

最新文章

  1. SQL 解决从分组数据中总是挑选第一条数据的问题
  2. python语言及其应用-python语言及其应用
  3. 初学laravel migrate常见错误解决
  4. Hibernate 多对多映射实列
  5. 数据挖掘应用现状与产品分析
  6. c++从零实现神经网络
  7. 废芯片做出来的艺术品!值得一看!
  8. Repeater嵌套绑定Repeater
  9. pandas之cut
  10. Netty技术细节源码分析-FastThreadLocal源码分析
  11. mysql创建复杂表_数据库_MySQL_复杂的表结构创建
  12. 算法学习--二叉查找树
  13. [转载] np.logical_and用法(有代码)
  14. java list 排序_java 对list进行排序
  15. 用友 NC客户化开发手册
  16. 大学计算机进制与转换教案,《进制转换》教案
  17. element-ui Dialog 对话框可拖拽
  18. 知识图谱在小米的应用与探索
  19. Java如何调用芝麻信用分?
  20. 几张表格怎么联动_在excel 中,怎样实现数据关联?:excel怎么把几个表格的数据联动...

热门文章

  1. 4G 全网通DTU是什么 有哪些功能应用
  2. 简述银行会计科目的分类
  3. 关于js如何获取鼠标划过文本的内容与下标
  4. 免费得到高程地图的方法
  5. 计算机 word 节是什么,Word中的分节符是什么,如何使用?
  6. mysq8窗口(开窗)及新特性函数
  7. Visual Studio Code的九九乘法表
  8. 现代材料分析方法习题汇总及答案
  9. 微信小程序添加激励式广告
  10. 2023厦门大学计算机考研信息汇总