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).注意,这是理想状态.在实际的 ...
随机推荐
- json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 column 33 (char 33)
json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 colu ...
- Cousera 无法播放视频 解决办法 widows 和 linux
查资料得知,Cousera无法播放课程视频原因在于DNS污染. 尽管通过FQ软件把视频看完了,在最后一课找到了这个解决办法,现在拿出来分享给大家: Windows: 请参照以下链接: http://j ...
- HBase之八--(2):HBase二级索引之Phoenix
1. 介绍 Phoenix 是 Salesforce.com 开源的一个 Java 中间件,可以让开发者在Apache HBase 上执行 SQL 查询.Phoenix完全使用Java编写,代码位于 ...
- [Java][Web]Web 工程中的各类地址的写法
// 1. request.getRequestDispatcher("/index.html").forward(request,response); // 以 / 开头,对于浏 ...
- oracle 索引使用小结
1. 普通索引 create index my_index on test (col_1); 可创建合并两列或多列的索引,最多可将32列合并在一个索引中(位图索引最多可合并30列) create in ...
- 解决Vmware workstation上不能安装Hyper-V的问题
从今天开始,博主正式开始学习微软相关的知识了.众所周知,微软的虚拟化技术Hyper-V现在也很火.可是博主也没有一台服务器来装Hyper-V.于是想到在自己的PC上先装一个Vmware worksta ...
- thinkphp5的程序部署到虚拟主机的配置
thinkphp5的程序部署到虚拟主机的配置 建议不要,因为这些目录文件会全部保留,那么没办法的时候咋整 1 htdocs 虚拟主机上的 把public/index.php修改 改动后的放到 ht ...
- maven中的pom配置文件标签的详细介绍
<span style="padding:0px; margin:0px"><project xmlns="http://maven.apache.or ...
- Django中多种重定向方法使用
本文主要讲解使用HttpResponseRedirect.redirect.reverse以及配置文件中配置URL等重定向方法 本文使用了Django1.8.2 使用场景,例如在表单一中提交数据后,需 ...
- Docker remote api 开启
https://www.cnblogs.com/520playboy/p/7921633.html ExecStart=/usr/bin/dockerd-current -H unix:///var/ ...