codevs 1255 搭积木 x
1255 搭积木
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题目描述 Description
一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1。总共有N个积木。(且每行积木数不超过10)
比如下图N=13 H=6 M=2。
输入描述 Input Description
第一行为三个整数、N、H、M。
第二行以后每行一个整数K,-1为结束符。
输出描述 Output Description
第一行为满足N、H、M的积木搭建方案总数(1<=N<=540 H<=60 M<=10)
以后每一行对于对应的K,给出顺序排列的第K种方案(最小的排列为第一种)。
(如样例中,2 1 2 3 2 3是一种方案,代表一层的积木分别为212323,232321也是一种方案,212323比232321要小,每个状态之间是可比的,第一个数小的排前面,第一个数相等的就看第二个数。那么所有方案就有一个顺序了,这里的K就是求第K个按顺序排列的方案)
样例输入 Sample Input
13 6 2
1
3
-1
样例输出 Sample Output
3
2 1 2 3 2 3
2 3 2 3 2 1
思路:
其实有两种思路,一种是DP,另一种就是记忆化搜索.
坑点:
在记忆化搜索时,剪枝是必不可少的!最优剪枝应该是当 n/h>10 或者是 n/h<1 时,是绝对不可能的!搜索速度大大提高!
代码:
这里暂时先给出记忆化搜索的代码~
/*
作者:狐白酒(my name on the codevs!)
题目:p1255 搭积木
*/ #include <iostream>
#include <cstdio>
#define LL long long using namespace std; int N,H,M;
bool v[][][];
LL f[][][]; LL dfs(int h,int n,int m)///high,sum,down
{
if(n/h> || n/h<) return f[h][n][m]=;
///这里剪枝剪的特多~
if(v[h][n][m]) return f[h][n][m];
else
{
if(h==)
{
v[h][n][m]=;
if(n==m && m<=)
return f[h][n][m]=;
else
return f[h][n][m]=;
}
if(h>=)
{
LL s=;
if(m->=)
s+=dfs(h-,n-m,m-);
if(m+<=)
s+=dfs(h-,n-m,m+);
v[h][n][m]=;
return f[h][n][m]=s;
}
}
} void ask(LL x,int h,int n,int m)
{
printf("%d ",m);
if(h>=)
{
if(x<=f[h-][n-m][m-])
ask(x,h-,n-m,m-);
else
ask(x-f[h-][n-m][m-],h-,n-m,m+);
}
} int main()
{
scanf("%d%d%d",&N,&H,&M);
dfs(H,N,M);
cout<<f[H][N][M]<<endl;
LL k;
while(cin>>k)
{
if(k==-) break;
ask(k,H,N,M);
printf("\n");
}
return ;
}
过几天再把动规的补上~
End.
codevs 1255 搭积木 x的更多相关文章
- codevs 3249 搭积木
提交地址:http://codevs.cn/problem/3249/ 3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目 ...
- Android_就像小朋友“搭积木”一样。
就像小朋友“搭积木”一样.感觉这句话很有意思.完整的话是这样的: Android提供了大量功能丰富的UI组件,开发者只要按一定规律把这些UI组件组合起来 --就像小朋友“搭积木”一样,把这些UI组件搭 ...
- Leo 搭积木
Leo 搭积木[问题描述]Leo是一个快乐的火星人,总是能和地球上的 OIers玩得很 high.2012 到了, Leo 又被召回火星了,在火星上没人陪他玩了,但是他有好多好多积木,于是他开始搭积木 ...
- XJOI1657&Codevs1255搭积木【树状动规】
搭积木 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10)比如上图N=13 H=6 M=2. 输入格式: 第一行 ...
- 蓝桥杯-搭积木-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- [Luogu 2816]宋荣子搭积木
Description saruka非常喜欢搭积木,他一共有n块积木.而且saruka的积木很特殊,只能一块块的竖着摞,可以摞很多列.说过saruka的是特殊的积木了,这些积木都非常智能,第i块积木有 ...
- 搭积木(block)
[问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...
- 搭积木(java)-蓝桥杯
搭积木小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9.搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小.最后搭成4层的金字塔形,必须用完所有的积木.下 ...
- 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程
编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...
随机推荐
- JDBC的一些简单通用代码
JDBC的一些简单通用代码 功能包括 连接数据库 查询操作 执行sql语句 jdbc相关类的加载 关闭连接 获取数据库格式的当前时间 代码 package dao; import java.sql.C ...
- tp5框架用foreach循环时候报Indirect modification of overloaded element of think\paginator\driver\Bootst错误
thinkphp5使用paginator分页查询数据后,需要foreach便利处理某一字段的数据,会出现类似题目的错误.主要是因为tp5使用分页类读取的数据不是纯数组的格式!所以在循环的时候需要用数据 ...
- [.net core]3. Project 文件简介
这是一个C#的空的.net core web app .net frame work的.csproj 要编辑的话,得先卸载项目, .net core的.csproje不必要, .csproj 的文件 ...
- RabbitMQ入门教程(七):主题交换机Topics
原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...
- java中的进制转换
java中的进制转换及转换函数 转自:https://blog.csdn.net/V0218/article/details/74945203 Java的进制转换 进制转换原理 十进制 转 二进制: ...
- Linux下关闭Tomcat
正常关闭操作 进入tomcat bin目录,执行 ./shutdown.sh 但是有时会失败 此时通过kill命令关闭 首先输入 ps -ef|grep tomcat 在列出的tomcat中,找到该t ...
- python-装饰器1
python-装饰器1 定义本质就是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码2.不能修改被装饰的函数的调用方式 def logger(): print(' ...
- nginx.conf laravel 配置
server { listen 443; server_name www.liuhuanguang.cn; #填写绑定证书的域名 ssl on; ssl_certificate cert/1_www. ...
- spring中spEL常用应用场景
spEL表达式表示:#{} 一.基本类型值运算操作 {}可以放置数字,字符串,布尔型,表达式(运算,正则,逻辑).这个应用场景和EL表达式一样的,实际中用的也不多. 注意:在XML中表示==,> ...
- creat-react-app生成的项目默认端口号是3000,如何更改?
从项目的 package.json 文件中可以看到,npm start即scripts start.js,因此我们找到scripts/start.js ,部分代码如下: 找到 DEFAULT_PORT ...