因为出卷任务需要找些矩阵的题,想着挺久没刷题了上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;
}
总之,以后还是不能局限自己的思维啊,这不是数据结构学傻么