UVa 10074 - Take the Land
来源:互联网 发布:js中控制div隐藏 编辑:程序博客网 时间:2024/05/16 03:12
題目:給你一個二位的01矩陣,0的位置為空,在上面放一個最大面積的矩形,問面積是多少。
分析:dp,動態規劃。普通的三次方算法可以簡單計算。
這裡給出一個O(N^2)的算法,使用單調隊列優化。
把前i行的每一列都看做是一個細矩形高為從i層開始向上連續的0,寬為1;
那麼我們的問題就轉化為,找到一層裡面的細矩形中可以畫出一個最大的矩形;
在第i層的細矩形中畫出最大的矩形的時間複雜度為O(N),這裡用到單調隊列;
以第j列的高度h(i,j)為高的矩形最大面積就是向兩邊延伸到高度小於他的邊界;
這個邊界用兩個單調隊列先兩邊掃面就可以求出所有高度的兩個邊界;
單調隊列存儲遞增的序列,遇到非遞減,所有他前面的高度大於他的都以她為右邊界;
將這些數據都彈出來,繼續計算,集體參照代碼;
說明:最近忙於寫文檔,╮(╯▽╰)╭。
#include <stdio.h>#include <stdlib.h>#include <string.h>char Maps[101][101];int MaxH[101][101];int L[101],R[101];int MUQ[101];int main(){ int t,m,n; while (~scanf("%d%d",&m,&n) && n) { for (int i = 1 ; i <= m ; ++ i) for (int j = 1 ; j <= n ; ++ j)scanf("%d",&Maps[i][j]); //计算每条底边上的每列高度 memset(MaxH, 0, sizeof(MaxH)); for (int i = 1 ; i <= m ; ++ i) for (int j = 1 ; j <= n ; ++ j) if (Maps[i][j] == 0) MaxH[i][j] = MaxH[i-1][j]+1; else MaxH[i][j] = 0; for (int i = 1 ; i <= m ; ++ i) MaxH[i][0] = MaxH[i][n+1] = -1; int MaxV = 0; for (int i = 1 ; i <= m ; ++ i) { //计算每个点的左边界 int tail = 0; MUQ[0] = 0; for (int j = 1 ; j <= n+1 ; ++ j) { while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j]) R[MUQ[tail --]] = j; MUQ[++ tail] = j; } //计算每个点的右边界 tail = 0; MUQ[0] = n+1; for (int j = n ; j >= 0 ; -- j) { while (tail >= 0 && MaxH[i][MUQ[tail]] > MaxH[i][j]) L[MUQ[tail --]] = j; MUQ[++ tail] = j; } //求解 for (int j = 1 ; j <= n ; ++ j) { int Temp = MaxH[i][j]*(R[j]-L[j]-1); if (MaxV < Temp) MaxV = Temp; } } printf("%d\n",MaxV); } return 0;}
0 0
- UVa 10074 - Take the Land
- UVa:10074 Take the Land
- UVa 10074 - Take the Land
- uva 10074 Take the Land
- uva 10074 Take the Land
- UVA 10074 Take the Land(最大子矩阵和变形)
- Take the Land - UVa 10074 变形最大子矩阵和
- UVA 10074 Take the Land dp/暴力+剪枝
- UVa 10074 Take the Land (转化思想&最大子矩阵和)
- uva 10499 - The Land of Justice
- uva-10499 - The Land of Justice
- UVa 10499 - The Land of Justice
- UVa 10499 - The Land of Justice
- UVA 10499 The Land of Justice
- uva 10499 - The Land of Justice
- uva 10499 The Land of Justice
- UVA 10499 The Land of Justice
- UVa 10499 - The Land of Justice
- C#方便操作数据总结
- SQL Server中的三种物理连接图文解析:Loop Join,Merge Join,Hash Join
- const在函数前与函数后的区别
- LeetCode Longest Valid Parentheses
- Java 里把 InputStream 转换成 String 的几种方法
- UVa 10074 - Take the Land
- 转载】Maven + SVN + Hudson 自动编译、部署、发布
- 写给新人数据挖掘基础知识介绍
- Android 绘图进阶:Canvas绘制联系人侧滑列表(drawText+监听者模式)
- @dynamic关键字
- svn搭建
- Node类源代码不完全分析
- [转]单表60亿记录等大数据场景的MySQL优化和运维之道
- 奇偶剪枝