之前听说过一种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)相关推荐

  1. NowCoder110E Pocky游戏 状压DP

    传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...

  2. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  3. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)

    题目描述 每天,巧克力在它的许多形式上被全世界数百万人分享.它是一个真正普遍的糖果,实际上在世界上每个国家都能得到. 你发现唯一比吃巧克力更好的事情是把它分享给朋友.不幸的是,你的朋友非常挑剔,有着不 ...

  4. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  5. 百练4124:海贼王之伟大航路(状压DP)

    题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms  内存限制: 65536kB 描述 " ...

  6. 「CTSC2017」吉夫特(Gift) (Lucas定理,状压DP)

    题面 链接 简单的题目,既是礼物,也是毒药. B 君设计了一道简单的题目,准备作为 gift 送给大家. 输入一个长度为 n n n 的数列 a 1 , a 2 , ⋯ , a n a_1, a_2, ...

  7. 【2022国赛模拟】无损加密——LGV引理、状压DP

    原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk​ 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk​ 了,暴力也只需要变动 [lk,rk] ...

  8. [九省联考2018]一双木棋chess(状压DP+博弈论+Minmax搜索)

    洛谷题目传送门 解题思路 nnn和mmm都很小,很容易想到状压DP 题目描述的规则大致是长这个样子 也就是说填的位置单调递减,我们大胆一点,设一个10进制的状压,表示每一列填到了那个位置,那么这个数要 ...

  9. 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)

    积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...

  10. NC15034 德玛西亚万岁(状压dp)

    链接:https://ac.nowcoder.com/acm/problem/15034 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识 ...

最新文章

  1. 加速点击控制应用中的边缘分析和机器学习部署 | 免费直播
  2. tomcat5应用移植到WAS5.1中的一些问题及解决
  3. 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?
  4. 2.4 万余门在线课程免费开放!大量计算机相关课程.(赶紧收藏)
  5. Linux 之目录 -鸟哥的Linux私房菜
  6. React Canvas:高性能渲染 React 组
  7. centos php mysql 5.6 安装_centos7安装nginx、php5.5、mysql5.6
  8. java 微信公众号js接入_SpringCloud : 接入 微信公众号平台(三)、获取JsSDK配置参数...
  9. php携程语比,PHP 协程
  10. 红米Redmi品牌独立首战告捷:半月多出货超100万
  11. vsftp匿名访问目录_怎么更改vsftp匿名用户的默认登录目录/var/ftp?
  12. 现代OpenGL教程 01 - 入门指南
  13. 学习《华为基本法》(大结局):法的修订与接班人
  14. dlib实现人脸对齐方法
  15. HTML编辑器-Bluefish 2.0.1 发布
  16. 最简单易懂的git介绍
  17. 策略模式(用策略模式实现我们淘宝,京东,美团等等简易满减活动)
  18. 喹啉羧酸类 DHODH 抑制剂用于治疗急性髓系白血病
  19. php 微信token验证失败,php下微信token验证失败怎么办?
  20. Quartz 使用(2.x版本)

热门文章

  1. 微服务架构复杂吗?全新角度详解,看完这篇你就明白了!
  2. 【系统架构】小型电商网站的架构(一)
  3. 关于微信小程序(应用号),这是三节课的全部看法和建议
  4. 参观 Facebook 是一种什么体验?
  5. 串口与定时器的重要关系_单片机串口必备基础知识
  6. 《算法图解》第八章贪婪算法
  7. Java 爬虫简单起步
  8. linux下alias命令具体解释
  9. centos 打包RPM包 ntopng
  10. Remove Duplicates from Sorted Array