codevs 1255 搭积木 x

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[62][542][12];
LL f[62][542][12];

LL dfs(int h,int n,int m)///high,sum,down
{
    if(n/h>10 || n/h<1) return f[h][n][m]=0;
///这里剪枝剪的特多~
    if(v[h][n][m]) return f[h][n][m];
    else
    {
        if(h==1)
        {
            v[h][n][m]=1;
            if(n==m && m<=10)
                return f[h][n][m]=1;
            else
                return f[h][n][m]=0;
        }
        if(h>=2)
        {
            LL s=0;
            if(m-1>=1)
                s+=dfs(h-1,n-m,m-1);
            if(m+1<=10)
                s+=dfs(h-1,n-m,m+1);
            v[h][n][m]=1;
            return f[h][n][m]=s;
        }
    }
}

void ask(LL x,int h,int n,int m)
{
    printf("%d ",m);
    if(h>=2)
    {
        if(x<=f[h-1][n-m][m-1])
            ask(x,h-1,n-m,m-1);
        else
            ask(x-f[h-1][n-m][m-1],h-1,n-m,m+1);
    }
}

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==-1) break;
        ask(k,H,N,M);
        printf("\n");
    }
    return 0;
}

过几天再把动规的补上~

End.

时间: 2024-12-25 20:23:33

codevs 1255 搭积木 x的相关文章

codevs 3249 搭积木

提交地址:http://codevs.cn/problem/3249/ 3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Petya有一个A×B×C的长方体积木,积木是有1×1×1的小积木块组成的.那么这个长方体的高为A,宽为B,长为C.(^-^哦亲,记住长方体的长不一定要比宽的数值大的哦). 现在好玩Petya在这个长方体中的的左上角挖去了一个(A-1)×(B-2)×(C-2)的小长方体.并且告诉你被挖去

UC前端‘搭积木’的模块化开发——scrat.js

模块化开发 将模块所需的js\css\img\tmpl维护在一起,一个模块一个目录 js渲染模板 css只关心模块内样式 开发团队心声:"我们希望每次研发新产品不是从零开始,不同团队不同项目之间能有可复用的模块沉淀下来." 模块生态 每个工程有_工程模块_和_生态模块_. 生态模块:基于_component规范_开发,部署到Github上,可以通过命令行工具将Github上的模块安装到工程中使用.比如:jQuery, iscroll, zepto.js, vue.js 安装命令: sc

外媒:智能手机影响幼儿脑发育 搭积木效果更好

据英国<卫报>网站2月2日报道,美国波士顿大学医学院的研究人员向人们敲响警钟,称大众深知电视和视频会对年幼儿童产生负面影响,然而在移动设备会对学龄前儿童大脑造成何种影响这一问题上,全社会普遍认识不足. 研究人员警告,使用平板电脑或智能手机来转移孩子的注意力可能会对他们的“社会情感发展”造成损害. “如果把这些设备作为安抚幼儿.转移他们注意力的主要方式,那他们还能建立自身的自我调节机制吗?”科学家问道. 研究人员还发现,三岁以下的幼儿如使用交互式屏幕还会削弱其学习数学和科学的能力. 波士顿大学医

搭积木(block)

[问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一些积木,其中第 i 个位置上叠了 a_i 块积木.小 OY 一开始会向小 C 指定 1..n 中的某个位置 s,然后,他在第 0 秒从位置s 出发,开始搭积木.他可以做这些动作:1.向左移动 1 个单位坐标,用时 1 秒.2.向右移动 1 个单位坐标,用时 1 秒.3.从当前位置顶部拿起一块积木,瞬

XJOI1657&amp;Codevs1255搭积木【树状动规】

搭积木 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10)比如上图N=13 H=6 M=2. 输入格式: 第一行为三个整数.N.H.M.第二行以后每行一个整数K,-1为结束符. 输出格式: 第一行为满足N.H.M的积木搭建方案总数(1<=N<=540 H<=60 M<=10)以后每一行对于对应的K,给出顺序排列的第K种方案(最小的排列为第一种). 样例输入: 13 6 2 1 3 -1 样例输出

3249 搭积木

3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Petya有一个A×B×C的长方体积木,积木是有1×1×1的小积木块组成的.那么这个长方体的高为A,宽为B,长为C.(^-^哦亲,记住长方体的长不一定要比宽的数值大的哦). 现在好玩Petya在这个长方体中的的左上角挖去了一个(A-1)×(B-2)×(C-2)的小长方体.并且告诉你被挖去长方体的体积为n,即n=(A-1)×(B-2)×(C-2).现在问你被挖

codevs3249搭积木

3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Petya有一个A×B×C的长方体积木,积木是有1×1×1的小积木块组成的.那么这个长方体的高为A,宽为B,长为C.(^-^哦亲,记住长方体的长不一定要比宽的数值大的哦). 现在好玩Petya在这个长方体中的的左上角挖去了一个(A-1)×(B-2)×(C-2)的小长方体.并且告诉你被挖去长方体的体积为n,即n=(A-1)×(B-2)×(C-2).现在问你被挖

阿里影业:搭积木的人

与盛大的多领域投资不同,阿里要做的,是在影视领域进行单点突破,搭建起一座全产业链的积木塔层.尽管愿景美好,但回归现实,阿里的基因仍是电商,这个与电影的跨界动作要完成得漂亮并不简单. 文/张书乐刊载于<商界评论>2015年4期 保利博纳影业总裁于冬在去年上海电影节上曾说:"电影公司未来都将给BAT 打工!"他预言中国的"八大公司"可能最后变成三大公司,就是BAT 的三大电影集团. 言犹在耳,预言却几近成真.最迅猛发力的则是阿里巴巴.3 月4 日,光线传媒发

搭积木(java)-蓝桥杯

搭积木小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9.搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小.最后搭成4层的金字塔形,必须用完所有的积木.下面是两种合格的搭法:      0    1  2  3  4  56  7  8  9      0    3  1  7  5  29  8  6  4 请你计算这样的搭法一共有多少种?请填表示总数目的数字.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 题目类型属于全排列筛