AcWing 152. 城市游戏 单调栈,栈解法,悬线法

2024-01-28 15:48

本文主要是介绍AcWing 152. 城市游戏 单调栈,栈解法,悬线法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:https://www.acwing.com/problem/content/description/154/
题目描述
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。

现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着’F’并且面积最大。

但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们将给你3*S两银子。

输入格式
第一行包括两个整数N,M,表示矩形土地有N行M列。

接下来N行,每行M个用空格隔开的字符’F’或’R’,描述了矩形土地。

每行末尾没有多余空格。

输出格式
输出一个整数,表示你能得到多少银子,即(3*最大’F’矩形土地面积)的值。

数据范围
1≤N,M≤1000
样例
输入样例:
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
输出样例:
45

思路:要由F组成最大的矩阵,等价于求直方图的最大面积。
 先统计第一行到每一行的连续矩形个数。如果下一行对应为'F',那么
 h[i][j]=h[i-1][j]+1;否则,h[i][j]=0;
 接下来枚举每一行,求直方图最大面积。 

求直方图最大面积模板:

a[n+1]=p=0;//增加一个高度为0的矩形,以免在扫描结束后还有剩余矩形
for(int i=1;i<=n;i++){if(a[i]>s[p]){//当前矩形比栈顶矩形高,直接入栈,并设置宽度为1s[++p]=a[i];w[p]=1;}else{int width=0;while(s[p]>a[i]){width+=w[p];//累计被弹出的矩形宽度之和ans=max(ans,width*s[p]);//不断更新面积最大值p--;//弹出}s[++p]=a[i],w[p]=width+1;//整个出栈过程结束后,把一个高度为当前矩形高度,宽度为累计值的新矩形入栈}
}

代码如下:

(1)单调栈解法:

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int h[N][N];//存储F的数量 
int n,m,s[N],w[N];//s为栈,w为宽度 
int get(int a[]){//对于每一行 int p=0,ans=0;a[m+1]=0; for(int i=1;i<=m+1;i++){if(a[i]>s[p]){//如果比栈顶元素高,直接进栈 s[++p]=a[i];w[p]=1;//宽度为1 }else{int width=0;while(s[p]>a[i]){width+=w[p];//累计被弹出的矩形之和 ans=max(ans,width*s[p]);//p--; }s[++p]=a[i],w[p]=width+1;//把一个高度为当前矩形高度,宽度为累计值的新矩形入栈 }}return ans;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char ch;cin>>ch;if(ch=='F') h[i][j]=h[i-1][j]+1;else h[i][j]=0;}}int ans=0;for(int i=1;i<=n;i++) ans=max(ans,get(h[i]));//枚举每一行,不断更新 cout<<ans*3<<endl;return 0;
}

(2)悬线法:https://www.cnblogs.com/Tyouchie/p/11382288.html

代码如下:https://www.acwing.com/solution/content/4873/
 

补充:求直方图最大面积:栈解法:https://www.nowcoder.com/questionTerminal/e3f491c56b7747539b93e5704b6eca40

代码如下:

int get(vector<int> &height){int ans=0;stack<int> st;for(int i=0;i<height.size();i++){if(st.empty()||height[i]>st.top()){//大于栈顶元素,入栈 st.push(height[i]);}else{int count=0;//记录弹出次数 /*如果栈非空 同时高度小于等于栈顶元素,那么就一直弹出栈顶元素,边弹出边计算更新ans, 直至height[i]>栈顶元素,此时将弹出的那几个数用height[i]替代入栈,最后height[i]自己再入栈 */while(!st.empty()&&height[i]<=st.top()){count++;ans=max(ans,st.top()*count);st.pop();}while(count--){st.push(height[i]);//让这个代替前面弹出的几个入栈 }st.push(height[i]);//自己入栈 }}int count=1;while(!st.empty()){//最后形成一个升序的栈 ans=max(ans,st.top()*count);//不断比较并更新 st.pop();count++;}return ans;
}

这篇关于AcWing 152. 城市游戏 单调栈,栈解法,悬线法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654085

相关文章

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu