code1225 搭积木
题目分析:将当前层定义为第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 搭积木的更多相关文章
- 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. * 文件名称: ...
- codevs 3249 搭积木
提交地址:http://codevs.cn/problem/3249/ 3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目 ...
- [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).注意,这是理想状态.在实际的 ...
随机推荐
- Google Cloud IAM中添加自定义域名
Google Cloud支持在IAM中加入自定义域名.具体方法如下: 1. 登录Google Cloud Console,点击IAM和管理,进入身份和组织 2. 点击注册 3. 会重定向到Gmail到 ...
- idea之jrebel热部署使用教程
JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...
- SAE部署Django1.6+MySQL
[解决]SAE部署Django1.6+MySQL 终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今 ...
- 历届试题 Excel地址
问题描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列, .... 当然 ...
- java代码---------常用的方法indexOf()和substring()方法的小结、主要是下标都是从0开始,很重要,错了就那个差远了啊
package com.s.x; //indexOf()方法从字符起始处的第一个位子开始的位置 //substring public class Wang { public static void m ...
- Java中的GetOpt操作
在shell工具中,有专门的getopt函数,使用方法如下所示: while getopts "d:t:vh" opt; do case "${opt}" in ...
- 第五章 MyEclipse配置hadoop开发环境
1.首先要下载相应的hadoop版本的插件,我这里就给2个例子: hadoop-1.2.1插件:http://download.csdn.net/download/hanyongan300/62381 ...
- java并发的基本概念和级别
并发的概念: 并发(Concurrency)和并行(Parallelism) 并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的.而并行是真正意义上的“同时执行”.严格意义上来说,并行的多个任 ...
- JavaScript笔录
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 1.JavaScri ...
- 关于服务器raid的一个记录
今天下午,在装操作系统的时候,特意的测试了下raid1的性能. 1. 开启操作系统 直接正常开启操作系统,操作系统的硬盘做的是raid1,从而数据写俩份,从而在损坏一张盘之后,另外一张盘并不会收到影响 ...