用长度从1至N的N块木板来围成一个围栏。要求是围栏成波浪形,即每块木板要么比它两边的木板都低(低位)要么比它两边的木板都高(高位)。现对所有符合要求的排列方式进行排序。排序规则是从第一块木板开始计算,越短的排名越前,前面的相等,向后依次比较。(即字典序)先给出N和一个指定的数字m,求符合要求的排列中的第m个。
输入:第一行一个正整数表示测试用例数。接下每行为一个测试用例,含两个数字分别表示N和m。
输出:指定的木板排列方案。 如图为n=4的所有情况
Sample Input
2
2 1
3 3

Sample Output
1 2 
2 3 1

首先类似于倍增优化dp,我们用试填法确定排名为c的栅栏各木板长度。
我们首先可以枚举第1块木板的长度,设为h,后面n-1块木板构成的总方案数为t,
若t>=c,则说明第1块木板长就为h,继续尝试确定第2块木板长度,否则c-=t,h增加1,重复上述判断。
然则(如此那么)我们可以求出答案,现在我们需要预处理t的值

设f[i,j,k]表示用i块长度不同的木板构建栅栏,最左边的木板从小到大排第j位,其状态为k(k为0表示低位,k为1表示高位)

f[i,j,0]=∑p=j~i-1f[i-1,p,1]
f[i,j,1]=∑p=1~j-1f[i-1,p,0]

long long f[21][21][2],m;
bool used[21];
void prepare()
{int i,j,k;f[1][1][0]=f[1][1][1]=1;for(i=2;i<=20;i++)for(j=1;j<=i;j++){for(k=j;k<=i-1;k++)f[i][j][0]+=f[i-1][k][1];for(k=1;k<=j-1;k++)f[i][j][1]+=f[i-1][k][0];}
}

接下来开始试填,记上一块木板长last,上一块高低位置为k,
1:k^=1;
2:枚举i的长度len,进行判断,找出确定的len
3:i加1,重复步骤

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
long long f[21][21][2],m;
bool used[21];
void prepare()
{int i,j,k;f[1][1][0]=f[1][1][1]=1;for(i=2;i<=20;i++)for(j=1;j<=i;j++){for(k=j;k<=i-1;k++)f[i][j][0]+=f[i-1][k][1];for(k=1;k<=j-1;k++)f[i][j][1]+=f[i-1][k][0];}
}
int main()
{int t,n,i,j,k,last,len;scanf("%d",&t);prepare();while(t--){scanf("%d%lld",&n,&m);memset(used,0,sizeof(used));for(j=1;j<=n;j++)//第一块木板单独处理
        {if(f[n][j][1]>=m){last=j;k=1;break;}else m-=f[n][j][1];if(f[n][j][0]>=m){last=j;k=0;break;}else m-=f[n][j][0];}used[last]=1;printf("%d ",last);for(i=2;i<=n;i++){k^=1;j=0;for(len=1;len<=n;len++){if(used[len])continue;j++;if((k==0&&len<last)||(k==1&&len>last))//合法性
                {if(f[n-i+1][j][k]>=m){last=len;break;}else m-=f[n-i+1][j][k];}}used[last]=1;printf("%d ",last);}puts("");}return 0;
}

转载于:https://www.cnblogs.com/dsb-y/p/11200593.html

A decorative fence(POJ1037)相关推荐

  1. 1037:A decorative fence

    题目要求: N 个木棒, 长度分别为1, 2, -, N. 构成美妙的栅栏. 除了两端的木棒外,每一跟木棒,要么比它左右的两根都长,要 么比它左右的两根都短. 符合上述条件的栅栏建法有很多种,对 于满 ...

  2. 【转】别人整理的DP大全

    为什么80%的码农都做不了架构师?>>>    动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...

  3. 转载[POJ题型分类]

    北大ACM题分类 主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的 ...

  4. ACM 网址和一些建议

    USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库,唯一 ...

  5. 【poj题集整理】【存下来并不会看】

    主要是整理起来自己用的.网上有多个版本. 初级: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)   ...

  6. (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目

    POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...

  7. 初学ACM之路(训练大纲)

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...

  8. ACM大量习题题库及建议培养计划

    ACM大量习题题库 ACM大量习题题库  现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO h ...

  9. ACM题目和培养训练!!!

    ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO ht ...

最新文章

  1. 【java】过滤器filter的使用
  2. 图像调整亮度饱和度 c语言,【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)...
  3. php如何实现区分编辑,php实现编辑和保存文件的方法
  4. 利用curl验证ssl网站(webservice)
  5. 华为正式发布鸿蒙智慧屏,5499 元、21999 元,2021 款华为智慧屏 V55/V85 明日 0 点正式开售:搭载鸿蒙系统...
  6. leetcode - 739. 每日温度
  7. Scikit-Learn与回归树
  8. JPA、Hibernate、Springdata JPA
  9. 机房重构——UML图最终版本
  10. 成人高考计算机基础历年真题,成人高考历年真题及答案
  11. python外国网站爬虫_10分钟教你用python爬取网站信息:这可能是全网最好用的爬虫代码...
  12. gcc: error trying to exec ‘cc1plus‘: execvp: Permission denied
  13. Msfvenom建立后门程序指令及开启监听
  14. 统计字符个数怎么用c语言写,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  15. 图片扫描文字识别工具:text scanner mac中文版
  16. 容器化与无状态微服务等
  17. Word技巧:如何使用正则表达式高效替换
  18. 开源/免费的视频会议:openmeetings的详细安装步骤
  19. Python 用 os.listdir() 获取文件列表和筛选特定格式文件
  20. 防百度云加速html,国内免费CDN百度云加速服务体验 - 国内外加速、防护、提高搜索体验...

热门文章

  1. c c 语言写的四六级词汇系统,2020英语四六级词汇积累:以c开头的单词(二)
  2. webservice框架_聊聊从RPC到服务治理框架
  3. 数字类 default 0和 default 0_数字化转型从0到N,只需这三步
  4. docker mysql镜像连接不上_还在手动安装应用?试一下Docker
  5. (11) nginx + keepalived 双机热备
  6. FilterListener笔记
  7. 大数据24小时:腾讯拟30亿元加码云计算,谷歌母公司Alphabet成立网络安全子公司“编年史”
  8. Struts 2配置详解
  9. 学习ModSecrity Handbook之摘录
  10. 在控制台中输入月,日. 计算这是一年的第几天.(Python)