A decorative fence(POJ1037)
用长度从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)相关推荐
- 1037:A decorative fence
题目要求: N 个木棒, 长度分别为1, 2, -, N. 构成美妙的栅栏. 除了两端的木棒外,每一跟木棒,要么比它左右的两根都长,要 么比它左右的两根都短. 符合上述条件的栅栏建法有很多种,对 于满 ...
- 【转】别人整理的DP大全
为什么80%的码农都做不了架构师?>>> 动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...
- 转载[POJ题型分类]
北大ACM题分类 主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的 ...
- ACM 网址和一些建议
USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库,唯一 ...
- 【poj题集整理】【存下来并不会看】
主要是整理起来自己用的.网上有多个版本. 初级: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) ...
- (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目
POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...
- 初学ACM之路(训练大纲)
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...
- ACM大量习题题库及建议培养计划
ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO h ...
- ACM题目和培养训练!!!
ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO ht ...
最新文章
- 【java】过滤器filter的使用
- 图像调整亮度饱和度 c语言,【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)...
- php如何实现区分编辑,php实现编辑和保存文件的方法
- 利用curl验证ssl网站(webservice)
- 华为正式发布鸿蒙智慧屏,5499 元、21999 元,2021 款华为智慧屏 V55/V85 明日 0 点正式开售:搭载鸿蒙系统...
- leetcode - 739. 每日温度
- Scikit-Learn与回归树
- JPA、Hibernate、Springdata JPA
- 机房重构——UML图最终版本
- 成人高考计算机基础历年真题,成人高考历年真题及答案
- python外国网站爬虫_10分钟教你用python爬取网站信息:这可能是全网最好用的爬虫代码...
- gcc: error trying to exec ‘cc1plus‘: execvp: Permission denied
- Msfvenom建立后门程序指令及开启监听
- 统计字符个数怎么用c语言写,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- 图片扫描文字识别工具:text scanner mac中文版
- 容器化与无状态微服务等
- Word技巧:如何使用正则表达式高效替换
- 开源/免费的视频会议:openmeetings的详细安装步骤
- Python 用 os.listdir() 获取文件列表和筛选特定格式文件
- 防百度云加速html,国内免费CDN百度云加速服务体验 - 国内外加速、防护、提高搜索体验...
热门文章
- c c 语言写的四六级词汇系统,2020英语四六级词汇积累:以c开头的单词(二)
- webservice框架_聊聊从RPC到服务治理框架
- 数字类 default 0和 default 0_数字化转型从0到N,只需这三步
- docker mysql镜像连接不上_还在手动安装应用?试一下Docker
- (11) nginx + keepalived 双机热备
- FilterListener笔记
- 大数据24小时:腾讯拟30亿元加码云计算,谷歌母公司Alphabet成立网络安全子公司“编年史”
- Struts 2配置详解
- 学习ModSecrity Handbook之摘录
- 在控制台中输入月,日. 计算这是一年的第几天.(Python)