A decorative fence
在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i-1}>a_i<a_{i+1}\))排列方案才是合法的,询问合法的第c个方案的全排列,\(n\leq 20,c\leq 2^{63}\)。
解
首先是求第几个方案,自然要用试填法,而排列问题不同于普通递推,因为一个数被放在这一个位置就不能在放了,但是注意到排列的一个性质,也就是注重大小关系,故可以考虑离散化递推。
为了试填,自然表现最左端填什么,也要表现序列的长度,为了能够维护序列的合法,不妨把最左端\(a_i>a_{i+1}\)记做,否则记做0,所以设\(f[i][j][k]\)表示长度为i的排列,最左端的数为第j大的数,状态为k的方案数,不难有
\]
\]
边界:\(f[1][1][0]=f[1][1][1]=1\),其余为0
于是我们就可以直接利用方案数从小到大试填了,注意第一个位置状态可1,可0,优先填1即可。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define ll long long
using namespace std;
bool used[21];
ll dp[21][21][2];
il void prepare();
int main(){
int lsy;scanf("%d",&lsy),prepare();
while(lsy--){
int n,last;bool p;ll c;
memset(used,0,sizeof(used));
scanf("%d%lld",&n,&c);
for(int i(1);i<=n;++i){
if(dp[n][i][1]>=c){
last=i,p=1;
break;
}
else c-=dp[n][i][1];
if(dp[n][i][0]>=c){
last=i,p=0;
break;
}
else c-=dp[n][i][0];
}printf("%d ",last),used[last]|=true;
for(int i(2),j,k;i<=n;++i){
p^=true;
for(j=1,k=0;j<=n;++j){
if(used[j])continue;++k;
if((p&&j>last)||(!p&&j<last))
if(dp[n-i+1][k][p]>=c){
last=j,used[j]|=true;
break;
}
else c-=dp[n-i+1][k][p];
}printf("%d ",last);
}putchar('\n');
}
return 0;
}
il void prepare(){
dp[1][1][0]=dp[1][1][1]=1;
for(int i(2),j,k;i<=20;++i)
for(j=1;j<=i;++j){
for(k=j;k<i;++k)dp[i][j][0]+=dp[i-1][k][1];
for(k=1;k<j;++k)dp[i][j][1]+=dp[i-1][k][0];
}
}
A decorative fence的更多相关文章
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- POJ1037 A decorative fence 【动态规划】
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6489 Accepted: 236 ...
- poj 1037 A decorative fence
题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...
- OpenJ_Bailian - 1037 A decorative fence
Discription Richard just finished building his new house. Now the only thing the house misses is a c ...
- POJ1037A decorative fence(动态规划+排序计数+好题)
http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...
- POJ1037A decorative fence(好dp)
1037 带点组合的东西吧 黑书P257 其实我没看懂它写的嘛玩意儿 这题还是挺不错的 一个模糊的思路可能会好想一些 就是大体的递推方程 dp1[][]表示降序 dp2[][]表示升序 数组的含义为长 ...
- 【POJ1037】A decorative fence(DP)
BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...
- poj1037 [CEOI 2002]A decorative fence 题解
---恢复内容开始--- 题意: t组数据,每组数据给出n个木棒,长度由1到n,除了两端的木棒外,每一根木棒,要么比它左右的两根都长,要么比它左右的两根都短.即要求构成的排列为波浪型.对符合要求的排列 ...
- $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$
Poj AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...
随机推荐
- swiper在微信端滑动效果不友好(滑动不了)的解决方案
如需转载请注明出处.好用就点赞吧 前提:我做的事竖直方向的一份报告,上下翻页滑动. 猜测原因: 1.检查自己的slide里面内容的样式的的高度,就是两个页面的高度不一致,测试的时候wrapper会取连 ...
- eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数
题目大意: 给定字符串 每次消除可消除连续的一段相同的字符的子串 求消除整个字符串的最少消除次数 #include <bits/stdc++.h> using namespace std; ...
- 如果通过cookies和localStorage取值?
1. getCook : 设定setCookie值 let setCookie = setCookie('wan',data,7); function setCookie(c_name,value,e ...
- Unity中嵌入网页插件Embedded Browser2.1.0
背景 最近刚换了工作,新公司不是做手游的,一开始有点抵触,总觉得不是做游戏自己就是跨行了,认为自己不对口,但是慢慢发现在这可以学的东西面很广,所以感觉又到了打怪升级的时候了,老子就在这进阶了. 一进公 ...
- IPointCollection.AddPoint Method的用法
补充指出官方帮助的一个问题. 该方法用于向环.线.面等几何中添加节点.官方帮助里是这样描述的:Adds a vertex to a Path, Ring, Polyline, or Polygon; ...
- usleep - 睡眠若干微秒
总览 (SYNOPSIS) usleep [number] 描述 (DESCRIPTION) usleep 睡眠 指定的 微秒数. 缺省值 是 1. 选项 (OPTIONS) --usage 显示 简 ...
- java拷贝--clone
大纲: java如何拷贝对象. 浅拷贝 深拷贝 一.java如何拷贝对象 Person p = new Person(); Person p2 = p; 上例并不是一个拷贝操作,只是把p对象的引用赋给 ...
- 暴力模拟——cf988E
很简单的题,就是模拟一下 #include<bits/stdc++.h> using namespace std; #define ll long long ll n,a[],len; i ...
- flume注意的事项
bin/flume-ng agent --conf conf/ --name a3 --conf-file conf/flume-dir.conf & 在使用Spooling Director ...
- NX二次开发-UFUN发射线函数UF_MODL_trace_a_ray的用法
今天是国庆节,放假休息懒得动,没有出去玩,在家研究一下发射线函数UF_MODL_trace_a_ray.小弟以前在软件公司混的时候,当时我做的那个项目就用到了UF_MODL_trace_a_ray,当 ...