题意

题目链接

Sol

这个题可能是TJOI2018唯一的非模板题了吧。。

考虑LCS的转移方程,

\[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1] + (A_i = B_j))
\]

也就是说我们如果知道了前一个列向量\(f[i - 1]\)以及\(A_i, B_j\)我们就可以转移了

那么可以暴力dp,\(f[i][sta][0/1/2]\)表示到第\(i\)个位置,当前LCS数组为sta的方案数,但是这个状态显然是\(K^K\)的。观察到一个性质:sta中的每个位置最多与前一个位置相差为\(1\),那么其实只需要记录一个差分数组就可以了。转移到的状态可以预处理。

复杂度\(O(9 * N * 2^K)\)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10, mod = 1e9 + 7;
template <typename A, typename B> inline int add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, K;
int f[2][(1 << 15) + 1][3], trans[(1 << 15) + 1][3], one[(1 << 15) + 1], ans[16];
char s[MAXN], ss[5] = "NOI";
int Get(int sta, int c) {
int pre[16] = {}, nw[16] = {};
for(int i = 1; i <= K; i++) pre[i] = pre[i - 1] + ((sta >> (i - 1)) & 1);
for(int i = 1; i <= K; i++) {
if(ss[c] == s[i]) nw[i] = pre[i - 1] + 1;
else nw[i] = max(nw[i - 1], pre[i]);
}
int ans = 0;
for(int i = 1; i <= K; i++) ans += (nw[i] - nw[i - 1]) << (i - 1);
return ans;
}
signed main() {
N = read(); K = read();
scanf("%s", s + 1);
f[0][0][0] = 1; int lim = 1 << K;
for(int sta = 0; sta < lim; sta++) {
one[sta] = one[sta >> 1] + (sta & 1);
for(int i = 0; i < 3; i++) trans[sta][i] = Get(sta, i);
}
int o = 0;
for(int i = 0; i <= N; i++) {
memset(f[o ^ 1], 0, sizeof(f[o ^ 1]));
for(int sta = 0; sta < lim; sta++) {
for(int len = 0; len < 3; len++) {
for(int c = 0; c < 3; c++) {
int nxt;
if(c == 0) nxt = 1;
else if(c == 1) nxt = (len == 1 ? 2 : 0);
else if(c == 2) nxt = (len == 2 ? 3 : 0);
if(nxt == 3) continue;
add2(f[o ^ 1][trans[sta][c]][nxt], f[o][sta][len]);
}
// cout << f[i + 1][sta][len] << '\n';
}
}
o ^= 1;
}
for(int i = 0; i < lim; i++)
for(int j = 0; j < 3; j++)
add2(ans[one[i]], f[o ^ 1][i][j]);
for(int i = 0; i <= K; i++) cout << ans[i] << '\n';
return 0;
}
/*
*/

洛谷P4590 [TJOI2018]游园会(状压dp LCS)的更多相关文章

  1. 洛谷P3959 宝藏(状压dp)

    传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...

  2. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  3. 【洛谷4941】War2 状压Dp

    简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...

  4. 洛谷 3959 宝藏——枚举+状压dp

    题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...

  5. 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...

  6. 洛谷 P1433 吃奶酪 状压DP

    题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...

  7. 洛谷P2473奖励关——状压DP

    题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...

  8. 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)

    传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...

  9. 洛谷 P1879 玉米田(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ...

随机推荐

  1. FF中flash滚轮失效的解决方案

    概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ...

  2. Kali学习笔记36:AVWS10的使用

    AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ...

  3. springboot动态修改日志级别+权限认证

    1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...

  4. postgresql 安装文档

    tar xf postgresql-9.4.5.tar.gz cd postgresql-9.4.5 yum grouplist yum grouplist|grep Deve yum groupin ...

  5. Python - 网络爬虫(Web Scraping)

    专栏 从零开始写Python爬虫:https://zhuanlan.zhihu.com/Ehco-python requests库的安装与使用:http://t.cn/RTuUuf7 BS4库的安装与 ...

  6. 使用Json封装scroll,已处理其兼容性问题

    scroll.js /* 使用Json封装scroll */ function scroll(){ //标准模式(遵循W3C标准) if(pageYOffset!==null){ return { t ...

  7. 新年放大招:Github 私库免费了!

    据<Github 嫁入豪门>这篇文章刚好半年了,那时候栈长还表示对 Github 的期待,仅仅半年,现在就已经有了巨大改变. 微软果然是豪门,嫁入半年就已经开花结果了,免费私库已全面无限制 ...

  8. 神奇的CSS3混合模式

    神奇的css3混合模式 对于前端开发人员应该都很熟悉Photoshop的图层混合模式,就是几个图层按不同的模式进行混合,实现不同的图像效果.但是当我们前端同学在切这些效果图的时候,基本上就是一刀切的, ...

  9. 使用 pandas 导出数据

    import pandas as pd # In[58]: df = pd.DataFrame(houselist) # In[59]: df # In[61]: df.to_csv('lianjia ...

  10. 一个前端开发者换电脑的过程(git篇)

    一,安装git. 要安装git,首先得把它下载下来.去到git官网. 现在开始安装. 讲真,这些东西哪些要勾哪些不要勾我也不清楚,所以全部都按默认的来,一路next. 现在再打开vscode的终端,发 ...