2021-08-29 三维积水问题 一时兴起的反思

博主分享了一次在出卷时遇到的三维矩阵积水问题,原本习惯性地将其归类为二维单调栈问题,但发现三维情况的解法远比想象中简单。通过从边缘向中心的贪心策略,利用木桶效应解决了问题。此经历让博主意识到不应局限于已知的数据结构解决方案,二维问题也可能存在更直观的线性解法。
摘要由CSDN通过智能技术生成

因为出卷任务需要找些矩阵的题,想着挺久没刷题了上leetcode看到一道眼熟的题。
在这里插入图片描述
给定一个三维矩阵,求最多能容纳的水量。

这不是二维下的积水问题的三维版扩展么。
一直被我当成一道质量很高的单调栈入门题,但是当我在思考三维情况该怎么推广时,却发现比我想得要难。
十分钟无果,翻了题解瞬间傻逼。
只要从边上一圈向中间贪心就行了,其核心是利用木桶效应,从边上一圈找最短的,计算相邻后得出部分答案,然后在相邻的柱子向内扩展,其巧妙之处是将算过的柱子看作已经填满水,即一边累计答案一边更新柱子的高度为最高能到的水位,以此保证形成新的子问题形成而无后效性。
重点不是这道题的解法,而是我自己的思维局限性,我总是将二维情况的问题视为单调栈的绝好题目,因为在线性解决时需要考虑之前的情况,这让我坚信不借助数据结构是无法线性解决的(当然这话好像是没毛病),甚至和学生都一直是这么说的,结果被这么简单的做法完爆了。
赶紧把二维的问题翻出来,一发完爆单调栈,,,

#include<cstdio>
#define maxn 10039
using namespace std;
int n;
int a[maxn];
long long ans;
int main(){
	scanf("%d", &n);
	for(int i = 1; i < n+1; i++)scanf("%d", a+i);
	int L = 1, R = n;
	while(L<R){
		if(a[L]<a[R]){
			if(a[L+1]<a[L])ans += a[L]-a[L+1], a[L+1] = a[L];
			L++;
		}
		else{
			if(a[R-1]<a[R])ans += a[R]-a[R-1], a[R-1] = a[R];
			R--;
		}
	}
	printf("%d", ans);
	return 0;
}

总之,以后还是不能局限自己的思维啊,这不是数据结构学傻么

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值