BZOJ3591 最长上升子序列(状压dp)
之前听说过一种dp套dp的trick,大致是用另一个dp过程中用到的一些东西作为该dp的状态。这个题比较类似。
考虑求LIS时用到的单调队列。设f[S]为所选取集合为S的方案数,其中在单调队列内的标2不在的标1。转移时考虑选择一个数是否合法,这只需要保证LIS长度不超过k且所给数的相对顺序不变。
注意dp顺序,从小到大先枚举选了哪些数再枚举哪些在单调队列里。以及注意卡常。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } #define N 15 int n,m,id[N],p[N+1],f[15000000]; bool flag[1<<N][N]; int v[1<<N][N],c[1<<N],mx[1<<N],s[1<<N],ans=0; int main() { #ifndef ONLINE_JUDGEfreopen("bzoj3591.in","r",stdin);freopen("bzoj3591.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifn=read(),m=read();for (int i=1;i<=m;i++) id[read()-1]=i;p[0]=1;for (int i=1;i<=n;i++) p[i]=p[i-1]*3;for (int i=0;i<(1<<n);i++)for (int j=0;j<n;j++)if (!(i&(1<<j))){if (!id[j]) flag[i][j]=1;else{int tot=0;for (int k=0;k<n;k++)if ((i&(1<<k))) tot+=(id[k]>0);if (tot+1==id[j]) flag[i][j]=1;}int t=-1,x=0;for (int k=0;k<n;k++)if (i&(1<<k)) x+=p[k];for (int k=n-1;k>j;k--)if (i&(1<<k)) t=k;if (~t) v[i][j]=x-p[t]+p[j];else v[i][j]=x+p[j];}else c[i]+=p[j],mx[i]=max(mx[i],j),s[i]++;f[0]=1;for (int x=0;x<(1<<n);x++)for (int y=x;y>0||y==0&&x==0;x==0?y--:y=y-1&x)if (f[c[x]+c[y]]){int i=c[x]+c[y],z=c[x];for (int j=0;s[y]==m?j<mx[y]:j<n;j++)if (flag[x][j]) f[z+p[j]+v[y][j]]+=f[i];if (x==(1<<n)-1) ans+=f[i];}cout<<ans;return 0; }
转载于:https://www.cnblogs.com/Gloid/p/9703407.html
BZOJ3591 最长上升子序列(状压dp)相关推荐
- NowCoder110E Pocky游戏 状压DP
传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...
- CodeForces - 1550E Stringforces(二分+状压dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...
- [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)
题目描述 每天,巧克力在它的许多形式上被全世界数百万人分享.它是一个真正普遍的糖果,实际上在世界上每个国家都能得到. 你发现唯一比吃巧克力更好的事情是把它分享给朋友.不幸的是,你的朋友非常挑剔,有着不 ...
- 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs
http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...
- 百练4124:海贼王之伟大航路(状压DP)
题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 " ...
- 「CTSC2017」吉夫特(Gift) (Lucas定理,状压DP)
题面 链接 简单的题目,既是礼物,也是毒药. B 君设计了一道简单的题目,准备作为 gift 送给大家. 输入一个长度为 n n n 的数列 a 1 , a 2 , ⋯ , a n a_1, a_2, ...
- 【2022国赛模拟】无损加密——LGV引理、状压DP
原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk 了,暴力也只需要变动 [lk,rk] ...
- [九省联考2018]一双木棋chess(状压DP+博弈论+Minmax搜索)
洛谷题目传送门 解题思路 nnn和mmm都很小,很容易想到状压DP 题目描述的规则大致是长这个样子 也就是说填的位置单调递减,我们大胆一点,设一个10进制的状压,表示每一列填到了那个位置,那么这个数要 ...
- 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)
积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...
- NC15034 德玛西亚万岁(状压dp)
链接:https://ac.nowcoder.com/acm/problem/15034 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识 ...
最新文章
- 加速点击控制应用中的边缘分析和机器学习部署 | 免费直播
- tomcat5应用移植到WAS5.1中的一些问题及解决
- 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?
- 2.4 万余门在线课程免费开放!大量计算机相关课程.(赶紧收藏)
- Linux 之目录 -鸟哥的Linux私房菜
- React Canvas:高性能渲染 React 组
- centos php mysql 5.6 安装_centos7安装nginx、php5.5、mysql5.6
- java 微信公众号js接入_SpringCloud : 接入 微信公众号平台(三)、获取JsSDK配置参数...
- php携程语比,PHP 协程
- 红米Redmi品牌独立首战告捷:半月多出货超100万
- vsftp匿名访问目录_怎么更改vsftp匿名用户的默认登录目录/var/ftp?
- 现代OpenGL教程 01 - 入门指南
- 学习《华为基本法》(大结局):法的修订与接班人
- dlib实现人脸对齐方法
- HTML编辑器-Bluefish 2.0.1 发布
- 最简单易懂的git介绍
- 策略模式(用策略模式实现我们淘宝,京东,美团等等简易满减活动)
- 喹啉羧酸类 DHODH 抑制剂用于治疗急性髓系白血病
- php 微信token验证失败,php下微信token验证失败怎么办?
- Quartz 使用(2.x版本)