[蓝桥杯][2018年第九届真题]搭积木

[[蓝桥杯][2018年第九届真题]搭积木](https://www.dotcpp.com/oj/problem2292.html)

题目:

小明对搭积木非常感兴趣。他的积木都是同样大小的正立方体。
在搭积木时,小明选取 m 块积木作为地基,将他们在桌子上一字排开,中间不留空隙,并称其为第0层。
随后,小明可以在上面摆放第1层,第2层,……,最多摆放至第n层。摆放积木必须遵循三条规则:

规则1:每块积木必须紧挨着放置在某一块积木的正上方,与其下一层的积木对齐;
规则2:同一层中的积木必须连续摆放,中间不能留有空隙;
规则3:小明不喜欢的位置不能放置积木。

其中,小明不喜欢的位置都被标在了图纸上。图纸共有n行,从下至上的每一行分别对应积木的第1层至第n层。每一行都有m个字符,字符可能是‘.’或‘X’,其中‘X’表示这个位置是小明不喜欢的。
现在,小明想要知道,共有多少种放置积木的方案。他找到了参加蓝桥杯的你来帮他计算这个答案。
由于这个答案可能很大,你只需要回答这个答案对1000000007(十亿零七)取模后的结果。
注意:地基上什么都不放,也算作是方案之一种。

题解:

参考博客
dp
我们用到两个函数:
check[i][j]:表示第i层前j个中有多少个‘X’
dp[l][r] = v:表示当前层中的[l,r]的方法数是v
check其实就是前缀和操作,对每一层进行前缀和运算
我们规定积木从下到上分别是第n层,第n-1层,最上面是第一层
我们首先用check来更新最低层dp的值
然后从最低层开始向上传递,即从大区间枚举到小区间后得出的方法数
转移方程是:
dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1]
因为我们的l和r分别是从两端开始向内走,所以我们更新区间[时也是由外向内更新,当更新区间[l,r]时,我们已经的值[区间l-1][r]和区间[l][r+1]区间[l-1][r+1],因为dp[l-1][r]和dp[l][r+1]中包括的是[l-1,r+1]+[l,r]所以要减去
在这里插入图片描述
这样的前提是[l,r]中没有X,因为除了最低层,其他层块的建立必须在下层的基础上建成且必须连续,不能有空中楼阁。
如果有X,则dp[l][r] = 0
不好理解u1s1,慢慢悟一悟
反正就是,先求出最低层,然后依次向上,求出枚举每一块区间,记录答案

代码:

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
typedef long long LL;
const int maxn = 110;
LL dp[maxn][maxn];///dp[l][r]=v记录的是当前层中的[l,r]的方法数为v(初始dp是dp[n][l][r])
///转移为dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1](因为dp[l-1][r]和dp[l][r+1]中包括的是[l-1,r+1]+[l,r]所以要减去)
///由题意可知初始化为第n层的方法数,即从大区间枚举到小区间后得出的方法数
///转移时若[l,r]中没有X,则方法数为dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1],相当于向上传递,反之从这一层开始[l,r]区间的方法数就为0
int check[maxn][maxn];
int main(){int n,m;char str[maxn];scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",str+1);for(int j=1;j<=m;j++){check[i][j]=check[i][j-1];///一个比较巧妙的方法if(str[j]=='X'){check[i][j]++;}}}LL ans=1;///没有放也是一种for(int i=1;i<=m;i++){///初始化for(int j=m;j>=i;j--){if(check[n][j]-check[n][i-1]==0){ans++;dp[i][j]=dp[i][j+1]+dp[i-1][j]-dp[i-1][j+1]+1;}}}for(int t=n-1;t>0;t--){///状态for(int i=1;i<=m;i++){for(int j=m;j>=i;j--){if(check[t][j]-check[t][i-1]==0){ans=(ans+dp[i][j])%MOD;dp[i][j]=(dp[i][j]+dp[i-1][j]+dp[i][j+1]-dp[i-1][j+1])%MOD;}else{dp[i][j]=0;}}}}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用C#把Tensorflow训练的.pb文件用在生产环境

训练了很久的Tf模型&#xff0c;终于要到生产环境中去考验一番了。今天花费了一些时间去研究tf的模型如何在生产环境中去使用。大概整理了这些方法。继续使用分步骤保存了的ckpt文件这个貌似脱离不了tensorflow框架&#xff0c;而且生成的ckpt文件比较大&#xff0c;发布到生产…

牛客题霸 转圈打印矩阵 C++题解/答案

牛客题霸 转圈打印矩阵 C题解/答案 题目描述 给定一个整型矩阵matrix&#xff0c;请按照顺时针转圈的方式打印它。 示例1 输入 复制 [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 返回值 复制 [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10] 题解&#xff1a; 题意很明确…

【招聘(上海)】东方财富证券招聘.net开发

东方财富证券&#xff1a;东方财富网(深创&#xff1a;300059)旗牌照齐全证券公司&#xff0c;极具互联网基因的券商。.Net服务端开发工程师/.Net前端开发工程师[职位介绍]服务端&#xff1a;开户、交易及资讯系统的后端接口服务(Asp.Net WebApi)开发&#xff1b;服务端&#x…

EF Core 实现多租户

SAAS 和多租户SaaS(软件及服务)区别于其他应用程序的主要特征就是能够使客户在使用应用程序时按照使用量付费。他们不需要为软件购买许可&#xff0c;也不需要安装、托管和管理它。这方面的操作全部由提供 SaaS 软件的组织负责。多租户是实现 SaaS 的关键因素, 它可以让多个企业…

牛客题霸 反转链表 C++题解/答案

题目描述 输入一个链表&#xff0c;反转链表后&#xff0c;输出新链表的表头。 示例1 输入 复制 {1,2,3} 返回值 复制 {3,2,1} 题解&#xff1a; 如果用偷懒的方法&#xff0c;可以用vector来存链表内容&#xff0c;然后来个翻转&#xff08;vector自带&#xff09;即可 但是…

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

上篇文章【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置&#xff08;2&#xff09;我们介绍了2种网关配置信息更新的方法和扩展Mysql存储&#xff0c;本篇我们将介绍如何使用Redis来实现网关的所有缓存功能&#xff0c;用到的文档及源码将会在GitHub上开源&a…

广州.net俱乐部12月份ABP框架活动场地征集、志愿者征集、合作讲师\副讲师征集...

大家好&#xff0c;我在<被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾>一文中提到&#xff0c;我将在12月份搞一场ABP框架活动&#xff0c;现向大家征集活动场地、志愿者、合作讲师\副讲师。活动课程标题是&#xff1a;如何用ABP框架快速完成项目这是内容大…

CF1446F-Line Distance【计算几何,树状数组,二分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1446F 题目大意 给出nnn个点&#xff0c;求所有点对构成的直线中与原点距离第kkk小的距离 2≤n≤105,1≤k≤n(n−1)22\leq n\leq 10^5,1\leq k\leq \frac{n(n-1)}{2}2≤n≤105,1≤k≤2n(n−1)​ 解题思路 二分还是挺显然的…

为什么是容器,Docker和Kubernetes?

如果你是一名IT行业的从业者&#xff0c;还没有听说过以上3个词的任何一个&#xff0c;抱歉&#xff0c;你可以改行了&#xff1b;如果你是一名技术人员&#xff0c;无论你是程序员&#xff0c;测试人员&#xff0c;运维工程师还是时髦的DevOps工程师&#xff0c;你还没有运行过…

一份来自28岁.NET老程序员的自白

写在前面很幸运&#xff0c;28岁的我头发还没有掉光&#xff0c;更幸运的是28岁的我开始了博客园的写作生活&#xff01;这样的技术分享经历让我拓展了自己的朋友圈&#xff01;有幸结识了像张善友张队&#xff08;连续13年的微软MVP&#xff09;&#xff0c;大石头(NewLife团队…

谈谈.NET Core中基于Generic Host来实现后台任务

前言很多时候&#xff0c;后台任务对我们来说是一个利器&#xff0c;帮我们在后面处理了成千上万的事情。在.NET Framework时代&#xff0c;我们可能比较多的就是一个项目&#xff0c;会有一到多个对应的Windows服务&#xff0c;这些Windows服务就可以当作是我们所说的后台任务…

2018 KubeCon + CloudNativeCon完美落幕,行云献力

2018年11月13-15日&#xff0c;由云原生计算基金会&#xff08;CNCF&#xff09;组织的KubeConCloudNativeCon首次登陆中国。经过了三天的技术交流和展示&#xff0c;大会随着15日下午最后一个议程的结束而完美落幕。作为云原生领域全球最大的峰会&#xff0c;KubeConCloudNati…

魔方Newlife.Cube权限系统的使用及模版覆盖详解

讲人&#xff1a;大石头时间&#xff1a;2018-11-14 晚上20&#xff1a;00地点&#xff1a;钉钉群&#xff08;组织代码BKMV7685&#xff09;QQ群&#xff1a;1600800内容&#xff1a;魔方Newlife.Cube权限系统的使用及模版覆盖详解准备源码地址: https://github.com/NewLifeX/…

我在微软做研发 | 亚洲创新的科研之力

丹棱君有话说&#xff1a;在庆祝微软亚洲研究院成立 20 周年之际&#xff0c;微软亚洲研究院的几位科学家向我们讲述了在这里&#xff0c;如何以科研热情推动了技术创新。走进微软亚洲研究院的办公园区&#xff0c;便会被这里安静的研究氛围所包围。在当今越来越多追求速度、提…

调试.NET CORE代码

前言core也用了很长一段时间了&#xff0c;发现很多小伙伴不知道如何调试core的代码。可想而知&#xff0c;以前使用mvc的时候&#xff0c;不需要发布代码&#xff0c;直接iis地址指向项目源码&#xff0c;然后附加到进程w3wp.exe就可以调试了。在core的项目里面已经不能这样玩…

牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案

牛客题霸 [二叉树中是否存在节点和为指定值的路径] C题解/答案 题目描述 给定一个二叉树和一个值\ sum sum&#xff0c;判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径&#xff0c; 例如&#xff1a; 给出如下的二叉树&#xff0c;\ sum22 sum22&#xff0c;…

从头开始学eShopOnContainers——Visual Studio 2017环境配置

一、安装和配置Docker环境1、安装Docker CE for Windows从官方网站下载并安装&#xff0c;https://docs.docker.com/docker-for-windows/install/。默认情况下Docker for Windows使用Hyper-V运行Linux VM。 如果您没有安装/启用Hyper-V&#xff0c;它将被安装&#xff0c;您可能…

ASP.NET Core 生成验证码

点击蓝字关注我使用验证码保护网站免受垃圾信息的选择有很多&#xff0c;比如Google ReCaptcha和captcha.com。这两者都可以整合到ASP.NET Core应用中去。然而&#xff0c;如果你出于某些原因&#xff0c;仍然希望自己写验证码&#xff0c;例如你下网站需要在中国大陆使用&…

【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

上篇文章【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis 我们介绍了网关使用Redis进行缓存&#xff0c;并介绍了如何进行缓存实现&#xff0c;缓存信息清理接口的使用。本篇我们将介绍如何实现网关自定义客户端授权&#xff0c;实现可以为不同的接入客户端设…

如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...

这是广州.net微软技术俱乐部12月份活动报名帖。此帖会持续更新。活动课程标题是&#xff1a;如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)这是内容大纲&#xff1a;ABP框架简介&#xff08;这里会聊聊.net真的不如JAVA吗&#xff1f;&#xff09;快的定义!用ABP…