洛谷P4590 [TJOI2018]游园会(状压dp LCS)
题意
Sol
这个题可能是TJOI2018唯一的非模板题了吧。。
考虑LCS的转移方程,
\]
也就是说我们如果知道了前一个列向量\(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)的更多相关文章
- 洛谷P3959 宝藏(状压dp)
		传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ... 
- 洛谷 P3112 后卫马克 —— 状压DP
		题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ... 
- 【洛谷4941】War2 状压Dp
		简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ... 
- 洛谷 3959 宝藏——枚举+状压dp
		题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ... 
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
		正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ... 
- 洛谷 P1433 吃奶酪 状压DP
		题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ... 
- 洛谷P2473奖励关——状压DP
		题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ... 
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
		传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ... 
- 洛谷 P1879 玉米田(状压DP入门题)
		传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ... 
随机推荐
- FF中flash滚轮失效的解决方案
			概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ... 
- Kali学习笔记36:AVWS10的使用
			AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ... 
- springboot动态修改日志级别+权限认证
			1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ... 
- postgresql 安装文档
			tar xf postgresql-9.4.5.tar.gz cd postgresql-9.4.5 yum grouplist yum grouplist|grep Deve yum groupin ... 
- Python - 网络爬虫(Web Scraping)
			专栏 从零开始写Python爬虫:https://zhuanlan.zhihu.com/Ehco-python requests库的安装与使用:http://t.cn/RTuUuf7 BS4库的安装与 ... 
- 使用Json封装scroll,已处理其兼容性问题
			scroll.js /* 使用Json封装scroll */ function scroll(){ //标准模式(遵循W3C标准) if(pageYOffset!==null){ return { t ... 
- 新年放大招:Github 私库免费了!
			据<Github 嫁入豪门>这篇文章刚好半年了,那时候栈长还表示对 Github 的期待,仅仅半年,现在就已经有了巨大改变. 微软果然是豪门,嫁入半年就已经开花结果了,免费私库已全面无限制 ... 
- 神奇的CSS3混合模式
			神奇的css3混合模式 对于前端开发人员应该都很熟悉Photoshop的图层混合模式,就是几个图层按不同的模式进行混合,实现不同的图像效果.但是当我们前端同学在切这些效果图的时候,基本上就是一刀切的, ... 
- 使用 pandas 导出数据
			import pandas as pd # In[58]: df = pd.DataFrame(houselist) # In[59]: df # In[61]: df.to_csv('lianjia ... 
- 一个前端开发者换电脑的过程(git篇)
			一,安装git. 要安装git,首先得把它下载下来.去到git官网. 现在开始安装. 讲真,这些东西哪些要勾哪些不要勾我也不清楚,所以全部都按默认的来,一路next. 现在再打开vscode的终端,发 ... 
