【BZOJ 3591】 最长上升子序列
来源:互联网 发布:linux命令日志文件 编辑:程序博客网 时间:2024/06/16 00:55
哎我还是太菜了,这么短的代码 断断续续 调了好久。
看数据范围 大概就是状压
题目名字是【最长上升子序列】 可以猜测是拿跑
那么可以设计一个状态
转移大概就是枚举
还有一个不知道有多大用 的常数优化。就是限制一下
#include <bits/stdc++.h>using namespace std;const int N=15;int n,m,S,T,pre[N],bit[1<<N],pow3[N],g[1<<N][N],d[1<<N][N],f[14348908],h[1<<N];int main(){ //freopen("aa.in","r",stdin); int i,j,k,x,y; scanf("%d%d",&n,&m); for(y=-1,i=0;i<m;++i){ scanf("%d",&x);--x; T|=(1<<x);pre[x]=y;y=x; } for(pow3[0]=i=1;i<n;++i)pow3[i]=pow3[i-1]*3; S=(1<<n)-1; for(i=0;i<=S;++i)bit[i]=bit[i>>1]+(i&1); for(i=0;i<=S;++i)for(j=0;j<n;++j)if(1<<j&i)h[i]+=pow3[j]; for(i=0;i<=S;++i)for(j=0;j<n;++j)if(!(1<<j&i)){ if(!((1<<j)&T))g[i][j]=1; else{ for(k=pre[j];~k;k=pre[k])if(!(1<<k&i))break; if(k<0)g[i][j]=1; } if(bit[((1<<(j+1))-1)&i]<m){ for(k=1<<(j+1);k<=i&&!(k&i);k<<=1); d[i][j]=1<<j|i; if(k<=i)d[i][j]^=k; } } f[0]=1; for(i=0;i<=S;++i)for(k=0;k<n;++k)if(g[i][k]){ for(j=i;;j=(j-1)&i){ if(f[h[i]+h[j]]&&d[j][k])f[h[1<<k|i]+h[d[j][k]]]+=f[h[i]+h[j]]; if(!j)break; } } int ans=0; for(i=1;i<=S;++i)if(bit[i]<=m)ans+=f[h[S]+h[i]]; printf("%d",ans); return 0;}
阅读全文
0 0
- 【BZOJ 3591】 最长上升子序列
- bzoj 3173 最长上升子序列
- BZOJ-3173-最长上升子序列
- BZOJ 3173: [Tjoi2013]最长上升子序列
- BZOJ 3173: [Tjoi2013]最长上升子序列
- bzoj 3173: [Tjoi2013]最长上升子序列
- BZOJ 3173: [Tjoi2013]最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- Leetcode:Path Sum II
- Android Studio【通用&方便】插件方式打包jar(不包含资源文件)
- 数据仓库
- 网络连接+HttpClient+AsyncTask
- UVALive 6085|Chemistry|字符串处理
- 【BZOJ 3591】 最长上升子序列
- LCA总结
- ROS常用命令
- MVP+Rxjava请求数据
- 蓝桥杯 算法提高 质数的后代
- 2017.11.03
- 宋家皇朝.
- conversion function 转换函数笔记----C++学习之路
- 运用继承来给员工发工资