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[i][j][0]=\sum_{k=j}^{i-1}f[i-1][k][1]
\]

\[f[i][j][1]=\sum_{k=1}^{j-1}f[i-1][k][0]
\]

边界:\(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的更多相关文章

  1. POJ1037 A decorative fence

    题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...

  2. POJ1037 A decorative fence 【动态规划】

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6489   Accepted: 236 ...

  3. poj 1037 A decorative fence

    题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...

  4. OpenJ_Bailian - 1037 A decorative fence

    Discription Richard just finished building his new house. Now the only thing the house misses is a c ...

  5. POJ1037A decorative fence(动态规划+排序计数+好题)

    http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...

  6. POJ1037A decorative fence(好dp)

    1037 带点组合的东西吧 黑书P257 其实我没看懂它写的嘛玩意儿 这题还是挺不错的 一个模糊的思路可能会好想一些 就是大体的递推方程 dp1[][]表示降序 dp2[][]表示升序 数组的含义为长 ...

  7. 【POJ1037】A decorative fence(DP)

    BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...

  8. poj1037 [CEOI 2002]A decorative fence 题解

    ---恢复内容开始--- 题意: t组数据,每组数据给出n个木棒,长度由1到n,除了两端的木棒外,每一根木棒,要么比它左右的两根都长,要么比它左右的两根都短.即要求构成的排列为波浪型.对符合要求的排列 ...

  9. $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$

    Poj  AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...

随机推荐

  1. Maven Optional & Exclusions使用区别

    Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反. Optional定义后,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖 ...

  2. mongodb java操作常用写法

    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组.下面介绍的是用java操作 ...

  3. Jquery中$.get(),$.post(),$.ajax(),$.getJSON(),$.getScript(),$.load()的用法总结

    参考文档 :  https://blog.csdn.net/jiandanokok/article/details/48809717 本文是对Jquery中$.get(),$.post(),$.aja ...

  4. 试探回溯法(backtracking)

    一.八皇后问题 国际象棋中皇后的势力范围覆盖其所在的水平线.垂直线以及两条对角线.现考查如下问题:在n*n的棋盘上放置n个皇后,如何使得她们彼此互不攻击,此时称她们构成一个可行的棋局.对于任何整数n ...

  5. MYSQL查询第二高的薪水

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+| Id | Salary |+----+--------+| 1 | 100 || ...

  6. 【SGU194】Reactor Cooling

    题目大意 给定一个无源无汇的网络,边的容量有上下界限制,试构造一个合理的流量. 题目分析 求无源汇上下界的可行流模板题. ①增加一个附加源和汇\(S,T\). ②把每个节点的\(\sum b_{u,i ...

  7. mysql服务命令行操作

    启动 net start mysql 关闭 net stop mysql 登陆 mysql -hlocalhost -uusername -ppassword 退出 exit 显示数据库 show d ...

  8. twentytwenty插件,图片对比轮播

    https://zurb.com/playground/twentytwenty 项目应用 http://decortrim.mml.digital/

  9. web 开发流程

    shopWeb登录 开发步骤 1 数据库 2 创建 Module 3 复制页面 4 创建目录包 添加需要的jar包(引入依赖) 配置文件 5 功能: 编写服务器程序

  10. linux安装MySQL-5.6.22-1.el6.i686.rpm-bundle.tar

    1.首先搜索系统有没有安装过mysql,使用命令 rpm -qa|grep mysql 有的话先卸载 rpm -e --nodeps  + mysql应用名字\ 2.在/usr/local下创建mys ...