洛谷P3672(排列计数dp)
来源:互联网 发布:unity3d手机游戏大全 编辑:程序博客网 时间:2024/06/01 10:01
也许我dp太水了,所以在noip前要放弃fft,学好图论动规和爆搜,然后找到这题,依然懵逼。
题面
题意:给定自然数n、k、x,求第k小的,长度为n的,逆序对对数为x的,1~n的排列。
先考虑一个弱鸡问题:如何求出第k个排列。
我们枚举第一位i,剩下的排列数为(n-1)!,若(n-1)!<k,则i太小了,k减去(n-1)!,否则第一位就是i。由于排列只和数的相对大小有关,剩下的n-1个数可看成子问题。
即使有了逆序对的限制,我们依然这样想。枚举第一位i,i产生的逆序对数为(i-1),剩下x-(i-1)个逆序对,然后很自然的设出f[i][j]为1~i排列,逆序对为j的方案数。就可以以f来判断i是不是小了。
然后f也很容易求,同样是枚举第一位i,同样产生(i-1)个逆序对,有
显然可以前缀和优化。
这题还有一些坑点,比如f会爆longlong,可用k+1代替,但前缀和数组不可以。
#include <iostream>#include <fstream>#include <algorithm>#include <cmath>#include <ctime>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define mmst(a, b) memset(a, b, sizeof(a))#define mmcp(a, b) memcpy(a, b, sizeof(b))typedef long long LL;const LL oo=1e13+1;LL k,f[301][45003],sum[2][45003];int n,x;int ans[301],a[301];bool vis[301];void work(int o){ if(!o) return; for(int i=1;i<=o;i++) { if(f[o-1][x-i+1]<k) k-=f[o-1][x-i+1]; else { ans[o]=a[i]; x=x-i+1; int cnt=0; vis[a[i]]=1; for(int j=1;j<=n;j++) if(!vis[j]) a[++cnt]=j; work(o-1); return; } }}int main(){ cin>>n>>k>>x; f[0][0]=1ll; int nn=(n*n-n)/2; for(int i=1;i<=n;i++) { int mx=(i*i-i)/2; f[i][0]=1ll; for(int j=1;j<=mx;j++) { f[i][j]=sum[(i&1)^1][j+1]-sum[(i&1)^1][max(j-i+1,0)]; if(f[i][j]>oo) f[i][j]=oo; } for(int j=0;j<=nn;j++) sum[i&1][j+1]=sum[i&1][j]+f[i][j]; a[i]=i; } work(n); for(int i=n;i>=1;i--) cout<<ans[i]<<" "; cout<<endl; return 0;}
阅读全文
0 0
- 洛谷P3672(排列计数dp)
- poj1037(dP+排列计数)
- poj1037 dp +排列计数
- ZOJ 3725 Painting Storages(DP解排列计数)
- ZOJ 3725 Painting Storages(DP解排列计数)
- poj 1037 dp+排列计数(美妙的栅栏)
- POJ 1037 A decorative fence(dp+排列计数)
- [BZOJ2111][ZJOI2010]排列计数(DP+组合数)
- 洛谷 P3672 小清新签到题(木治啊!!)
- ZOJ 3725 Painting Storages DP+排列计数
- CS 400 Restricted Permutation 排列,DP计数
- 洛谷P2606 [ZJOI2010]排列计数
- hdu5116(dp + 计数)
- HDU4055 (dp计数)
- bzoj3193(计数dp)
- 【bzoj2111】【zjoi2010】【perm排列计数】【dp+Lucas定理】
- 2111: [ZJOI2010]Perm 排列计数 DP+组合数学
- POJ 1037 A decorative fence DP+排列计数 *
- Java基础之集合框架--Collections.synchronizedList() 线程安全的List
- 前端之css-flex
- 将jar包打入maven库中的命令
- java复习笔记4:封装,继承,多态
- Python 爬虫-爬取pixiv特定搜索结果的所有作品-登陆
- 洛谷P3672(排列计数dp)
- algorithm
- LeetCode 54. Spiral Matrix
- css之display:inline-block与float区别
- 字符串全组合
- Bitwise Operation
- HDU-6214 Smallest Minimum Cut(最大流)
- Tensorflow-图像标签问题
- Qt之打包发布(NSIS详解)