题目分析:将当前层定义为第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. supervisor备忘

    supervisor是把普通app变成deamon的工具,虽然没有erlang的supervise粒度那么细,但是已经非常方便了 安装 sudo apt-get install supervisor ...

  2. Unix网络编程 3.9 readline函数

    其实看APUE时就想试着写些简单的stdio函数了,但是一直没实践,看到这里时发现书上写得不完整,便敲代码试了下. 第1个readline速度非常慢原因在于每次读取字符都执行了系统调用read(),而 ...

  3. Java中的<< 和 >> 和 >>> 详细分析

    <<表示左移移,不分正负数,低位补0: 注:以下数据类型默认为byte-8位 左移时不管正负,低位补0 正数:r = 20 << 2 20的二进制补码:0001 0100 向左 ...

  4. 枚举生成1~n的排序

    /*枚举生成1~n的排列*/ #include <iostream> #include<algorithm> #include<queue> #include< ...

  5. 解决IIS无响应假死状态

    方法一: 临时解决办法:在IIS中选择你的网站,右击->属性,选择主目录选项卡,最下面有个应用程序池选项,记住该处的名字,然后在IIS中找到应用程序池并展开,选择你刚才看到的那个名字,右击-&g ...

  6. 为什么要使用叶脊(leaf-spine)拓扑网络?

    三层网络设计的结构发展已经很成熟,但leaf-spine (leaf叶节点,spine脊节点)结构越来越热门,网络设计师们应该如何进行选择呢? 尽管三层网络结构应用广泛而且技术成熟,但随着技术的发展, ...

  7. fiddler的介绍

    一.Fiddler是一个http协议代理工具,主要有以下功能: 1.监控http/https流量.截获http/https请求 2.查看并调试截获到的请求 3.伪造请求与响应 4.测试网站性能 5.解 ...

  8. mysql注入快速学习基础

    前言: sql注入想学好,学通.必须得了解一下基础的SQL 语句.这里我快速理一理 正文: 搭建环境建议下phpsduy快速搭建 select * from kasi select 字段名 from ...

  9. 一个简单的异常/条件重试类(C#)

    单个类,简单好用 using System; using System.Linq.Expressions; using System.Threading; using System.Threading ...

  10. [转] C#2010 在TreeView控件下显示路径下所有文件和文件夹

    原文 张丹-小桥流水,C#2010 在TreeView控件下显示路径下所有文件和文件夹 C#2010学习过程中有所收获,便总结下来,希望能给和我一样在学习遇到困难的同学提供参考. 本文主要介绍两个自定 ...