1.题目描述

https://www.hackerrank.com/challenges/lego-blocks

2.解法分析

这题乍看一下觉得应该可以用动态规划来做,但是却死活想不到最优子结构,在网上搜了一下,找到一个英文的描述,整理如下。

首先需要明白一点,稍微复杂一点的动态规划不一定能直接找到最优子结构,可能内嵌一些其他的最优子结构,比如说这题,我们需要得到如下的知识:

  • layerCom[w] : 表示高度为 1 ,宽度为 w 的墙有多少种,先暂且忽略solid structure这个约束
    • layerCom[1] = 1  layerCom[2] = 2  layerCom[3] = 4 layerCom[4] = 8 这个是可以直接枚举获得的
    • 当w > 4 时,一直layerCom[w] = layerCom[w-1] +layerCom[w-2] + layerCom[w-3]+ layerCom[w-4] ,其中,layerCom[w-i]表示最左一块砖是宽度为 i 的情况。
  • wholeCom[w][h] : 表示宽度为 w,高度为h的墙总共有多少种,也是先忽略solid structrue这个约束

    • 很显然,wholeCom[w][h] = power(layerCom,h)
  • retCom[ w][h] : 表示施加了solid structure这个约束时,宽度为w,高度为h的墙的种类,递推公式如下,其中

    表示以从右至左第i块条垂面作为切割面,左边是solid structure,右边是随意形状的种类

3.代码

不考虑modula的条件的代码如下:

#include <stdio.h>

#include <string.h>

#include <cmath>

#include <stdlib.h>

#include <iostream>

#include <vector>

using namespace std;

int getCom(int w,int h);

int main() {

 

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   

    int T;

    cin>>T;

    int i = 0;

    while(i<T)

    {

        int N,M;

        cin>>N>>M;

        cout<<getCom(M,N)<<endl;

        i++;

    }

    return 0;

}

int getCom(int w,int h)

{

    vector<int> layerCom((w<4 ? 4:w),0);

    layerCom[0] = 1;

    layerCom[1] = 2;

    layerCom[2] = 4;

    layerCom[3] = 8;

    

    if(w > 4)

    {

        for(int i = 4;i<w;++i) layerCom[w-1]=layerCom[w-2] + layerCom[w-3] + layerCom[w-4] + layerCom[w-5];

    }

 

    vector<int>wholeCom(w,0);

    for(int i=0;i<w;++i)wholeCom[i]=(int)pow((double)layerCom[i],h);

 

    vector<int> retCom(w,0);

    retCom[0] = 1;

 

    for(int i = 1;i<w;++i)

    {

        retCom[i] = wholeCom[i];

        for(int j = 1;j<=i;++j)

        {

            retCom[i] -= retCom[i-j]*wholeCom[j-1]; 

        }

    }

 

    return retCom[w-1];

}

lego blocks的更多相关文章

  1. hackerrank【Lego Blocks】:计数类dp

    题目大意: 修一个层数为n,长度为m的墙,每一层可以由长度为1.2.3.4的砖块构成. 每一层都在同一个长度处出现缝隙是方案非法的,问合法的方案数有多少种 思路: 先求出总方案,再减去所有非法的方案数 ...

  2. iOS Architecture Patterns

    By Bohdan Orlov on 21 Mar 2016 - 0 Comments iOS FYI: Slides from my presentation at NSLondon are ava ...

  3. (转)A Recipe for Training Neural Networks

    A Recipe for Training Neural Networks Andrej Karpathy blog  2019-04-27 09:37:05 This blog is copied ...

  4. (转) Learning Deep Learning with Keras

    Learning Deep Learning with Keras Piotr Migdał - blog Projects Articles Publications Resume About Ph ...

  5. The Unix Tools Are Your Friends

    The Unix Tools Are Your Friends Diomidis Spinellis IF, ON MY WAY TO EXILE ON A DESERT ISLAND, I had ...

  6. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  7. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  8. 开发该选择Blocks还是Delegates

    前文:网络上找了很多关于delegation和block的使用场景,发现没有很满意的解释,后来无意中在stablekernel找到了这篇文章,文中作者不仅仅是给出了解决方案,更值得我们深思的是作者独特 ...

  9. poj 1390 Blocks

    poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...

随机推荐

  1. R语言学习笔记——Base Graphics

    做exploratory data annalysis的作业,差点被虐死了,R从头开始,边做边学,最后搞到一点多才弄完,还有一个图怎么画都不对,最后发现是数据读取的时候有问题. 用来画图的数据来自:h ...

  2. 手机上的频段GSM GPRS分别是什么

    GSM是一种第二代无线通信的网络制式标准,GPRS是GSM应用的一种数据业务(如上网).频段:上行:890-915MHz(中国移动:890-909,中国联通:909-915)下行:935-960MHz ...

  3. BZOJ 1257 余数之和sum

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1257 题意:计算sigama(m%i)(1<=i<=n). 思路: 这样就简 ...

  4. 观察者模式最佳案例实现[JAVA][原创]

    /** * American Stock Exchange market(ASE) has a list of stocks.A stock object has two perspective in ...

  5. R语言的向量化编程思维

    1.计算缺失值比例 perNA<- mean(is.na(Data1)) 2.按值替换 #which返回值是符合条件的下标 NAIDX<- which(Data2<=3 | Data ...

  6. MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一

    抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...

  7. Windows上安装Yeoman

    之前直接安装完Node.js后,运行npm install -g yo命令,结果出现什么"要安装framework2.0 sdk,vcbuild"什么的错误,怎么也弄不好,结果是各 ...

  8. dede 去power by dedecms

    include/dedesql.class.php 下的$arrs1和$arrs2的全注释掉

  9. SQL Server 2008 序列号

    SQL Server 2008 序列号:Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise:   JD8Y6-HQG69-P9H84-XDTPG-34 ...

  10. ios 内存管理 心得

    - alloc, copy, retain会把引用计数+1 - release会把引用计数-1 - 局部变量如果初始化时不是autorelease的,要及时调用release释放,并且赋值为nil否则 ...