P1191 矩形【洛谷算法习题】
P1191 矩形网页链接P1191 矩形题目描述给出一个n × n n \times nn×n的矩阵矩阵中有些格子被染成白色有些格子被染成黑色现要求矩阵中白色矩形的数量。输入格式第一行一个整数n nn表示矩形的大小。接下来n nn行每行n nn个字符这些字符为W \verb!W!W或B \verb!B!B。其中W \verb!W!W表示白格B \verb!B!B表示黑格。输出格式一个正整数为白色矩形数量。输入输出样例 #1输入 #14 WWBW BBWB WBWW WBWB输出 #115说明/提示对于30 % 30\%30%的数据n ≤ 50 n ≤ 50n≤50对于100 % 100\%100%的数据n ≤ 150 n ≤ 150n≤150解题思路本题核心是悬线法区间枚举优化高效统计矩阵中的全白矩形数量。遍历矩阵的每一行作为矩形的底边维护数组h[j]表示第j列从当前行向上连续的白色格子数遇到黑色格子则将值清零。针对每一行枚举左边界j并向右扩展右边界k遇到黑色格子立即剪枝中断同时记录区间[j,k]内h的最小值该最小值即为当前区间能构成的合法白色矩形数量将其累加到总答案中。算法时间复杂度为O ( n 3 ) O(n^3)O(n3)结合黑格剪枝优化完美适配n ≤ 150 n≤150n≤150的数据规模。总结核心逻辑悬线法记录列连续白格高度枚举左右区间计算最小高度累加得到白色矩形总数。关键操作维护连续白高数组、区间枚举剪枝、最小高度累加计数。效率保障O ( n 3 ) O(n^3)O(n3)复杂度适配题目约束黑格剪枝大幅提升实际运行效率。代码内容#includebits/stdc.husingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll p1e97;constll INF1e18;constll M1e610;intmain(){ios::sync_with_stdio(false);cin.tie(0);intn;cinn;vectorinth(n2,0);intans0;for(inti1;in;i){for(intj1;jn;j){charc;cinc;if(cW)h[j];elseh[j]0;}for(intj1;jn;j){intcurh[j];for(intkj;kn;k){if(!h[k])break;curmin(cur,h[k]);anscur;}}}coutans\n;return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2565658.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!