题意

求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\)

题解

考虑朴素的LIS:\(f[i] = min(f[j]) + 1\)

记\(mx[i]\)为\(f\)的前缀最大值,那么可以得到一个性质\(mx[i + 1] \in [mx[i], mx[i] + 1]\)

对\(mx\)数组进行差分,则差分数组只有\(01\),可以状压

由于\(mx[1] - mx[0]=1\),从第二位开始状压

然后考虑从\(1\sim i\)的排列推到\(1\sim i+1\)的排列,\(1\sim i\)的差分数组为\(S\)。把i插入第\(j\)(\(1\sim i+1\))个数前面:

若\(j=1\):新状态为\(S << 1\),即\(mx[2]\)为\(0\),而其余不改

若\(j>1\):\(mx[1]\) 到 \(mx[j - 1]\)不变,\(mx[j]\)到\(mx[i]\)整体右移一位,新的\(mx[j]\)为1,但要把新的\(mx[j]\)后面第一个\(1\)删去(因为\(j\)处答案变大了,所以该点和新答案一样大,差分数组对应\(0\))

注意实现的时候第\(k\)个位置对应\(1<<(k-2)\)

打表程序:

	static int dp[2][134217728], ans;
for(int n = 1; n <= 28; n ++) {
memset(dp, 0, sizeof dp);
int r = 0; dp[0][0] = 1; ans = 0;
for(int i = 1; i < n; i ++, r ^= 1) {
fill(dp[r ^ 1], dp[r ^ 1] + (1 << i), 0);
for(int j = 0; j < (1 << (i - 1)); j ++) if(dp[r][j]) {
upd(dp[r ^ 1][j << 1], dp[r][j]);
int la = -1;
for(int k = i + 1; k >= 2; k --) {
int t = j;
if(j >> (k - 2) & 1) la = k - 2;
if(~ la) t ^= 1 << la;
t = t >> (k - 2) << (k - 1) | ( 1 << (k - 2) ) | ( j & (( 1 << (k - 2) ) - 1) );
upd(dp[r ^ 1][t], dp[r][j]);
}
}
}
for(int i = 0; i < (1 << (n - 1)); i ++)
upd(ans, 1ll * dp[r][i] * (__builtin_popcount(i) + 1) % mo);
int fac = 1;
for(int i = 2; i <= n; i ++) fac = 1ll * fac * i % mo;
printf("%d, ", 1ll * ans * qpow(fac, mo - 2) % mo);
}

提交程序:

#include <cstdio>
const int qwq[] = {1, 499122178, 2, 915057326, 540715694, 946945688,
422867403, 451091574, 317868537, 200489273, 976705134, 705376344, 662845575,
331522185, 228644314, 262819964, 686801362, 495111839, 947040129, 414835038,
696340671, 749077581, 301075008, 314644758, 102117126, 819818153, 273498600, 267588741};
int main() {
int n; scanf("%d", &n); printf("%d\n", qwq[n - 1]);
return 0;
}

「BZOJ 5161」最长上升子序列「状压DP」的更多相关文章

  1. 洛谷 P4484 - [BJWC2018]最长上升子序列(状压 dp+打表)

    洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式 ...

  2. BZOJ3591 最长上升子序列(状压dp)

    之前听说过一种dp套dp的trick,大致是用另一个dp过程中用到的一些东西作为该dp的状态.这个题比较类似. 考虑求LIS时用到的单调队列.设f[S]为所选取集合为S的方案数,其中在单调队列内的标2 ...

  3. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  4. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

    [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  5. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  6. 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」

    题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...

  7. 「BZOJ 4565」「HAOI 2016」字符合并「区间状压DP」

    题意 给一个长度为\(n(\leq 300)\)的\(01\)串,每次可以把\(k(\leq 8)\)个相邻字符合并,得到新字符和一定分数,最大化最后的得分 题解 考虑设计dp:\(dp[S][i][ ...

  8. ☆ [POJ2411] Mondriaan's Dream 「状压DP」

    传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...

  9. 「CF744C」Hongcow Buys a Deck of Cards「状压 DP」

    题意 你有\(n\)个物品,物品和硬币有\(A\),\(B\)两种类型,假设你有\(M\)个\(A\)物品和\(N\)个\(B\)物品 每一轮你可以选择获得\(A, B\)硬币各\(1\)个,或者(硬 ...

随机推荐

  1. 一文让你明白Redis持久化

    网上虽然已经有很多类似的介绍了,但我还是自己总结归纳了一下,自认为内容和细节都是比较齐全的. 文章篇幅有 4k 多字,货有点干,断断续续写了好几天,希望对大家有帮助.不出意外地话,今后会陆续更新 Re ...

  2. oracle练手(一)

    练手001 1.列出至少有一个员工的所有部门 select dname from dept where deptno in (select deptno from emp); select dname ...

  3. IOC之MEF学习

    MEF原理上很简单,找出有共同接口的导入.导出.然后找到把导出的实例化,赋给导入.说到底MEF就是找到合适的类实例化,把它交给导入.Export 特性可修饰类.字段.属性或方法,而 Import 特性 ...

  4. [NOIP10.5模拟赛]1.a题解--离散化+异或线段树

    题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...

  5. 3. Java开发环境的搭建:安装JDK,配置环境变量

    1.安装JDK开发环境 下载网站:http://www.oracle.com/ 开始安装JDK: 修改安装目录如下: 确定之后,单击“下一步”. 注:当提示安装JRE时,可以选择不要安装. 2.配置环 ...

  6. Javascript的学习清单

    Javascript的学习清单 Javascript学习资源 程序员必读书籍 深入理解JavaScript系列 es6教程 jQuery中文文档 vue官网 zeptojs中文版 常用的插件与UI组件 ...

  7. JavaScript获取数组索引

    JavaScript获取数组索引: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  8. 使用openSSL构造一个支持https的nodejs服务器

    首先通过下面的链接下载openSSL https://slproweb.com/products/Win32OpenSSL.html 下载完毕后,执行openssl进入交互式界面: 使用命令生成pri ...

  9. Ubuntu Nginx Uwsgi Python布置服务器Django项目

     1 安装python 3.6 ubuntu预装了2.7,不需要卸载预装库,直接安装python3.6(其实现在的阿里云18.04会给你自动装python2.7.15和3.6.8) 你可以分别查看一下 ...

  10. (备忘)Python字符串、元组、列表、字典互相转换的方法

    #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type 'str'> {'age': 7, ...