博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3591: 最长上升子序列
阅读量:5245 次
发布时间:2019-06-14

本文共 876 字,大约阅读时间需要 2 分钟。

靖爷的仙仙题,其实并不难,可是想了挺久,码了挺久,调了挺久,本人菜鸡了挺久,还是不够专注

就是问n的排列中,最长上升子序列长度为k的方案数,同时有一些约束

不难想到把求lis的单调栈压下来,但是还要压一个这个数字用了没有,状态数就是2^2n的了。感觉这个做法不对然后就想歪了

其实可以把这个东西压成三进制的,0不存在,1存在且在单调栈,2存在且已出单调栈,注意1,2不能调换,不然枚举顺序就出问题了

详情见代码。卡常没卡过

 

#include
#include
#include
#include
#include
#include
using namespace std;const int _=1e2;const int maxn=15+2;const int fbin=(1<<15)+_;const int tbin=14348907+_;int n,li;int m,num[maxn],rk[maxn],sf[fbin];void getsf(){ for(int i=1;i<=m;i++)rk[num[i]]=i; for(int zt=0;zt
=1;i--) if(zt&(1<
>1]+(zt&1); }}int mi[maxn],f[tbin];//0不存在,1存在且在单调栈,2存在且已出单调栈void divi(int zt,int &xx,int &yy)//该三进制是由(这个数是否存在)(这个数是否在单调栈里)两个二进制压缩而成的{ xx=0,yy=0; for(int i=1;i<=n;i++) { int d=zt/mi[i-1]%3; if(d>=1)xx|=(1<

 

 

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/10852857.html

你可能感兴趣的文章
2018-09-12
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
CSS与Theme的作用——Asp.Net
查看>>
LeetCode(17) - Letter Combinations of a Phone Number
查看>>
20165115 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Linux查找命令对比(find、locate、whereis、which、type、grep)
查看>>
WPF自定义集合控件概述与遇到的问题
查看>>
路由器外接硬盘做nas可行吗?
查看>>
python:从迭代器,到生成器,再到协程的示例代码
查看>>
pytest的参数化测试
查看>>
Java多线程系列——原子类的实现(CAS算法)
查看>>
安装Pygame和pip的艰辛之路
查看>>
Hibernate的实体类为什么需要实现 java.io.Serializable 接口
查看>>
在Ubuntu下配置Apache多域名服务器
查看>>
多线程《三》进程与线程的区别
查看>>
Min Stack
查看>>
老鸟的Python入门教程
查看>>
Ubuntu下非常给力的下载工具--uget+aria2
查看>>
Nginx配置
查看>>