题目分析:将当前层定义为第h层,共用了n块积木,本层积木数为m,f(h,n,m)

那么可以扩展数两种状态:f(h-1,n-m,m-1),f(h-1,n-m,m+1)

直接搜索可能的数据达到h^m,超时超空间。

通过记录中间状态减少重复计算,同时剪枝:所有n个积木搭h层,每层积木平均数1<x<10, 超过这个范围就不可能了。

搜索的边界条件也要考虑到。F(1,i,i)=1.

动态规划的方程也可以写出来:f(h,n,m)=f(h-1,n-m,m-1)+f(h-1,n-m,m+1)

递归找方案:查找第k个方案的时候,根据节点左右关系,比左节点小向左找,否则向右找

注意向右找时k要减掉左侧的方案数

代码:

#include<iostream>
using namespace std; int N,H,M;
long long k;
long long f[][][];
bool vis[][][]; long long dfs(int h,int n,int m){
if(m>||m<)return ;
if(n/h>||n/h<)return f[h][n][m]=;//剪枝
if(vis[h][n][m])return f[h][n][m];
if(h==){
vis[h][n][m]=true;
if(m==n)return f[h][n][m]=;
else return f[h][n][m]=;
} f[h][n][m]=;
if(n-m>){
f[h][n][m]+=dfs(h-,n-m,m+);
f[h][n][m]+=dfs(h-,n-m,m-);
}
vis[h][n][m]=true;
return f[h][n][m];
} void find(long long x,int h,int n,int m){
cout<<m<<' ';
if(h>=){
if(x<=f[h-][n-m][m-])find(x,h-,n-m,m-);
else find(x-f[h-][n-m][m-],h-,n-m,m+);
}
} int main(){
cin>>N>>H>>M;
cout<<dfs(H,N,M)<<endl;
while(){
cin>>k;
if(k<)break;
else find(k,H,N,M);
cout<<endl;
}
return ;
}

测试点#0.in 结果:AC 内存使用量: 1128kB 时间使用量: 0ms 
测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 
测试点#2.in 结果:AC 内存使用量: 364kB 时间使用量: 1ms 
测试点#3.in 结果:AC 内存使用量: 492kB 时间使用量: 0ms 
测试点#4.in 结果:AC 内存使用量: 360kB 时间使用量: 0ms 
测试点#5.in 结果:AC 内存使用量: 364kB 时间使用量: 0ms 
测试点#6.in 结果:AC 内存使用量: 488kB 时间使用量: 0ms 
测试点#7.in 结果:AC 内存使用量: 1004kB 时间使用量: 0ms 
测试点#8.in 结果:AC 内存使用量: 492kB 时间使用量: 0ms 
测试点#9.in 结果:AC 内存使用量: 748kB 时间使用量: 0ms

code1225 搭积木的更多相关文章

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

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

  2. Leo 搭积木

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

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

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

  4. 蓝桥杯-搭积木-java

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

  5. codevs 3249 搭积木

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

  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. Micro-PaaS(Docker+K8S)

    1.概述 Docker是一种Linux容器工具集,它是为构建(Build).交付(Ship)和运行(Run)分布式应用而设计的. Kubernates:是开源的容器集群管理系统.它构建在Docker技 ...

  2. appium历史版本下载地址

    https://github.com/appium/appium-desktop/releases

  3. Java-Runoob-面向对象:Java 包(Package)

    ylbtech-Java-Runoob-面向对象:Java 包(Package) 1.返回顶部 1. Java 包(package) 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. ...

  4. Java-Runoob:Java 方法

    ylbtech-Java-Runoob:Java 方法 1.返回顶部 1. Java 方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println( ...

  5. AIX存储LV PV VG (转载)

    1.基本概念:PV 物理卷:普通的直接访问的存储设备,有固定的和可移动的之分,代表性的就是硬盘.vg 卷组:AIX中最大的存储单位,一个卷组由一组物理硬盘组成,也就是由一个或多个物理卷组成.pp 物理 ...

  6. 灾难恢复:RPO与RTO

    许多企事业单位虽然已经认识到信息安全的重要性,却迟迟没有行动.其中的原因是多方面的,最主要的一个原因就是在如何建立容灾系统的问题上存在种种疑惑.容灾设计指标主要与容灾系统的数据恢复能力有关,最常见的设 ...

  7. touch python

    一  使用while循环输出 1 2 3 4 5 6 8 9 10. i=0 while i<10: i=i+1 if i == 7: continue print(i) 二  求 1-100所 ...

  8. CentOS7.6安装稳定版Nginx

    官网地址:http://nginx.org/en/linux_packages.html#RHEL-CentOS 需先安装依赖:sudo yum install -y yum-utils 安装开始: ...

  9. 六、配置github的pull request触发jenkins自动构建

    之前的配置,都是向master分支push操作触发jenkins进行构建,但是在一般的正常工作中,不会允许程序员直接向主分支推送代码:正常都是fork一个本地的分支,在本地分支调试完后,向主干分支提交 ...

  10. linux anaconda 管理 python 包

    1.下载 anaconda https://www.continuum.io/downloads 2.安装anaconda 3.conda install package-name //利用anaco ...