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的更多相关文章

  1. codevs 3249 搭积木

    提交地址:http://codevs.cn/problem/3249/ 3249 搭积木  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目 ...

  2. Android_就像小朋友“搭积木”一样。

    就像小朋友“搭积木”一样.感觉这句话很有意思.完整的话是这样的: Android提供了大量功能丰富的UI组件,开发者只要按一定规律把这些UI组件组合起来 --就像小朋友“搭积木”一样,把这些UI组件搭 ...

  3. Leo 搭积木

    Leo 搭积木[问题描述]Leo是一个快乐的火星人,总是能和地球上的 OIers玩得很 high.2012 到了, Leo 又被召回火星了,在火星上没人陪他玩了,但是他有好多好多积木,于是他开始搭积木 ...

  4. XJOI1657&Codevs1255搭积木【树状动规】

    搭积木 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10)比如上图N=13 H=6 M=2. 输入格式: 第一行 ...

  5. 蓝桥杯-搭积木-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  6. [Luogu 2816]宋荣子搭积木

    Description saruka非常喜欢搭积木,他一共有n块积木.而且saruka的积木很特殊,只能一块块的竖着摞,可以摞很多列.说过saruka的是特殊的积木了,这些积木都非常智能,第i块积木有 ...

  7. 搭积木(block)

    [问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...

  8. 搭积木(java)-蓝桥杯

    搭积木小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9.搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小.最后搭成4层的金字塔形,必须用完所有的积木.下 ...

  9. 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程

    编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...

随机推荐

  1. JDBC的一些简单通用代码

    JDBC的一些简单通用代码 功能包括 连接数据库 查询操作 执行sql语句 jdbc相关类的加载 关闭连接 获取数据库格式的当前时间 代码 package dao; import java.sql.C ...

  2. tp5框架用foreach循环时候报Indirect modification of overloaded element of think\paginator\driver\Bootst错误

    thinkphp5使用paginator分页查询数据后,需要foreach便利处理某一字段的数据,会出现类似题目的错误.主要是因为tp5使用分页类读取的数据不是纯数组的格式!所以在循环的时候需要用数据 ...

  3. [.net core]3. Project 文件简介

    这是一个C#的空的.net core web app .net frame work的.csproj 要编辑的话,得先卸载项目,  .net core的.csproje不必要, .csproj 的文件 ...

  4. RabbitMQ入门教程(七):主题交换机Topics

    原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  5. java中的进制转换

    java中的进制转换及转换函数 转自:https://blog.csdn.net/V0218/article/details/74945203 Java的进制转换 进制转换原理 十进制 转 二进制: ...

  6. Linux下关闭Tomcat

    正常关闭操作 进入tomcat bin目录,执行 ./shutdown.sh 但是有时会失败 此时通过kill命令关闭 首先输入 ps -ef|grep tomcat 在列出的tomcat中,找到该t ...

  7. python-装饰器1

    python-装饰器1 定义本质就是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码2.不能修改被装饰的函数的调用方式 def logger(): print(' ...

  8. nginx.conf laravel 配置

    server { listen 443; server_name www.liuhuanguang.cn; #填写绑定证书的域名 ssl on; ssl_certificate cert/1_www. ...

  9. spring中spEL常用应用场景

    spEL表达式表示:#{} 一.基本类型值运算操作 {}可以放置数字,字符串,布尔型,表达式(运算,正则,逻辑).这个应用场景和EL表达式一样的,实际中用的也不多. 注意:在XML中表示==,> ...

  10. creat-react-app生成的项目默认端口号是3000,如何更改?

    从项目的 package.json 文件中可以看到,npm start即scripts start.js,因此我们找到scripts/start.js ,部分代码如下: 找到 DEFAULT_PORT ...