首页 > 其他分享 >P8675 [蓝桥杯 2018 国 B] 搭积木 题解

P8675 [蓝桥杯 2018 国 B] 搭积木 题解

时间:2023-08-29 23:45:26浏览次数:39  
标签:前缀 int 题解 sum 蓝桥 搭积木 复杂度 ll dp

总述

此题用区间 dp 解决,二维前缀和优化。

朴素做法

阶段:自上而下数每一层。

状态:\(dp_{i,l,r}\) 表示自上而下数第 \(i\) 行中在 \([l,r]\) 摆积木的方案数。

状态转移方程:根据题意可知,若要在 \([l,r]\) 中摆积木,那么 \([l,r]\) 中不允许有 \(\tt{X}\),而第 \(i\) 层的 \([l,r]\) 要摆积木,就需要第 \(i+1\) 层的来托住。因此方程为:

\[dp_{i,l,r}=\sum_{x=1}^l \sum_{y=r}^m dp_{i+1,x,y} \]

初始化:很明显,若第 \(n\) 层的 \([l,r]\) 中没有 \(\tt{X}\),那么 \(dp_{n,l,r}=1\),否则为 \(0\),而对于判断是否合法,可将每一行做一个一维前缀和,这样可以 \(O(1)\) 判断。

答案:所有 \(dp_{i,l,r}\) 之和,即:

\[1+ \sum_{i=1}^n \sum_{l=1}^{m} \sum_{r=l}^m dp_{i,l,r} \]

时间复杂度:这样的时间复杂度为 \(O(nm^4)\),无法承受,考虑优化。

二维前缀和优化

观察状态转移方程,可用二维前缀和优化,将所有的 \(dp_{i+1,l,r}\) 视作一个点,因为都在第 \(i+1\) 层,因此可以用滚动数组优化掉一维。那么 \(\sum_{x=1}^l \sum_{y=r}^m dp_{i+1,x,y}\) 就是矩阵 \((1,r) \sim (l,m)\) 的和。

时间复杂度二维前缀和是 \(O(m^2)\),而转移可以 \(O(1)\),因此时间复杂度为 \(O(nm^2)\),足矣通过本题。

#include <cstdio>

#define ll long long

const int N=105;
const int M=105;
const int mod=1e9+7;

int n,m;
ll ans=1;
char mp[N][M];
int c[N][M];
ll dp[N][M][M];
ll sum[M][M];

int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {
		scanf(" %s",mp[i]);
		for(int j=0;j<m;j++) c[i][j+1]=c[i][j]+(mp[i][j]=='X');//一维前缀和优化
	}
	for(int l=1;l<=m;l++) {
		for(int r=l;r<=m;r++) {
			if(!(c[n][r]-c[n][l-1])) dp[n][l][r]=1;//初始化
			ans+=dp[n][l][r];
			ans%=mod;
		}
	}
	for(int i=n-1;i>=1;i--) {//阶段
		for(int l=1;l<=m;l++) {//二维前缀和优化
			for(int r=1;r<=m;r++) sum[l][r]=(dp[i+1][l][r]+sum[l][r-1]+sum[l-1][r]-sum[l-1][r-1])%mod;
		}
		for(int len=1;len<=m;len++) {//状态
			for(int l=1;l+len-1<=m;l++) {
				int r=l+len-1;
				if(c[i][r]-c[i][l-1]) continue;
				dp[i][l][r]=(sum[l][m]-sum[l][r-1]-sum[0][m]+sum[0][r-1])%mod;//决策
				ans+=dp[i][l][r];
				ans%=mod;
			}
		}
	}
	printf("%lld\n",(ans+mod)%mod);//答案可能会出现负数,前面加减乘除取模过多
	return 0;
}

标签:前缀,int,题解,sum,蓝桥,搭积木,复杂度,ll,dp
From: https://www.cnblogs.com/Scorilon/p/17666143.html

相关文章

  • P7809 [JRKSJ R2] 01 序列 题解
    对于第二种操作,很容易想到只有\(1\)或\(2\)两种答案,若该区间内存在\(01\)这个子序列,那么答案为\(2\)反之为\(1\).可以通过对该\(01\)串做一个前缀和,若出现\(01\)这个子序列就累加,最后判断左右端点是否相等即可,时间复杂度\(O(n)\).对于第一种操作,\(\text{Subtest1}......
  • CF1833D Flipper 题解
    赛场上思路出来了但是代码没调出来。首先考虑右端点,很明显,要让操作后的序列字典序尽量地大,那么就要使操作后的序列第一个数尽量地大,考虑\(n\)或\(n-1\),如果\(n\)在原序列的第一个位置,那么此时无论怎么调整都无法使得它在新序列的第一个位置,此时就要考虑让\(n-1\)在新序列......
  • UVA10054 The Necklace题解
    题意给定一个无向图,其中至多有\(50\)个结点,求是否有欧拉回路。题解很明显就是一个无向图求欧拉回路的板子,我们用\(\tt{Hierholzer}\),先说存图,要明确的一个点是这个无向图里是有可能有重边的,所以我们要注意记录的时候不应是单独地记录某一条边是否存在,而是要记录某一条边的数......
  • UVA967的题解
    设\(check_i\)为\(1\simn\)中满足题意的数的数量。显然答案为\(check_j-check_{i-1}\)。注意到\(check\)能直接暴力求出来。那么就可以先把\(10^6\)范围内的所有质数求出来,然后所有数跑一遍,每个数都去旋转得出所有数后判断是否均为质数,记录下来。代码很好写。#incl......
  • 一些奇怪的题的题解
    给定\(n\),求:\[\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)}\]思路分析:先化式子:\[\begin{aligned}\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)}&=\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{d}[\gcd(i,j)=d]\\&=\sum_{d=1}^n\s......
  • CF1774 题解
    A考虑在所有\(0\)前添加正号,在\(1\)前轮流添加正负号即可。B首先根据抽屉原理,我们可以取出最多的颜色,个数记为\(mx\),然后其余颜色可以填在\(mx\)的两两中间,最少要有\((mx-1)(k-1)\)个空位。但是只是必要的,而不是充分的。考虑有多个最大值的情况,发现这些不是作为分界......
  • RTSP/Onvif视频服务器EasyNVR视频平台设备在线但通道无法播放的问题解决方案
    EasyNVR是基于RTSP/Onvif协议的视频平台,可支持将接入的视频流进行全平台、全终端的分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用户可参照官方接口文档进行操作。......
  • P3888 题解
    problem&blog。这怎么评到紫上去的啊?差不多就个上位绿吧/qd。首先出题人非常low。为什么这样说呢?因为\(nm\le50,m\len\)就是在说\(m\le7\),出题人为了不让你一眼秒掉这一题,就用这种猥琐的方法写数据范围,是不是很傻逼呢。然后就是状压DP板板题了,判断合法状态只需要......
  • 安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • [HAOI2012] 高速公路 题解
    [HAOI2012]高速公路题解题目链接题目要求我们求期望,先考虑一下求期望的公式。根据期望的定义得:期望费用\(E_v=\dfrac{所有可能路线的总费用}{所有可能路线的数量}\).其中,所有可能路线的数量\(=C_{R-L+1}^2=(R-L+1)(R-L)\),可以在常数时间内计算。(这里用大写的\(L\),\(......