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. CDH的ntp时间同步

    云服务器: ntpq -p ntpdate -u 10.52.255.1  #手动同步 自建NTP服务器: https://www.cnblogs.com/yinzhengjie/p/9480665. ...

  2. [转帖]教你如何修改运行中的docker容器的端口映射

    教你如何修改运行中的docker容器的端口映射   在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...

  3. awk 命令使用指南

    一:awk 的执行流程 (1) 首先执行BEGIN{} 块中的初始化操作 (2) 然后从指定的数据文件中循环读取一个数据行 ( 自动更新 NF.NR.$0.$1....., 等内建变量的值) (3) ...

  4. Maven - Maven3实战学习笔记(2)坐标和依赖

    1.maven坐标元素 maven坐标元素包括:groupId.artifactId.version.packaging.classifier. classifier:定义输出的附属构件.groupI ...

  5. 用Kindle阅读PDF最简单的3个方法!

    老实说,Kindle 对于PDF文件是很不友好的,经常会出现各种排版问题,所以,对电子阅读器方面比较了解的同学都知道,如果需要经常用阅读器查看PDF文件的话,最好还是买一款更大屏幕的设备,而Kindl ...

  6. 1-Kubernetes基本概念

    Kubernetes中的大部分概念如Node.Pod.Replication Controller.Service等都可以看作一种"资源对象",几乎所有的资源对象都可以通过Kube ...

  7. springmvc中的参数接收

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...

  8. php邮件防注入以及实现经典代码

    <?php function spamcheck($field) {     // filter_var() 过滤 e-mail     // 使用 FILTER_SANITIZE_EMAIL ...

  9. Delphi 基于组件的编程思想

  10. 3.SpringBoot整合Mybatis(一对多)

    前言: Mybatis一对多的处理关系: 一个人有好多本书,每本书的主人只有一个人.当我们查询某个人拥有的所有书籍时,就涉及到了一对多的映射关系. 一.添加数据表: CREATE TABLE `boo ...