题目的意思是给一个01的字符串数组,让你去求解满足棋盘条件的最大棋盘

棋盘的条件是:

  相邻元素的值不能相同

此题有点像求全1的最大子矩阵,当时求全1的最大子矩阵是用直方图求解的

本题可以利用直方图求解

首先找到子矩阵的两个顶点坐标(x0,y0),(x1,y1)

我们能遍历开始和结束列,y0=i, y1=j, 我们可以在y0和y1之间寻找满足条件的的最大棋盘,即在y0和y1之间找高度最大的满足条件的子矩阵

然后遍历i,j取最大的即可

对于满足条件的子行,有两种情况,一种是010101...,另一种是10101010.....,

定义0为010101...这种方式的行,定义1为1010101...这种方式的行,定义X为其他不满足条件的方式

这样对于每个i和j的矩阵就可以表示成 row[] = “010XX10101X11000”,

row[0]='0',代表第0行是01010101...

row[1]='1',代表第1行是10101010.....

row[3]=‘X’,  代表第3行存在相邻元素,即存在....00.....或.....11.......的情况

这样我们只需要在row中找到最大的相邻元素不同的序列的高度,上面的最大的不同序列是10101,即最大高度为5,然后乘以宽度(j-i+1),即是目前i和j之间的最大棋盘

然后求所有棋盘中最大的即可

    int MaxArea(vector <string> board) {
int res = , w = board[].length(), h = board.size();
for(int i = ; i < w; ++ i){
for(int j = i ; j < w; ++ j){
char row[h];
for(int k = ; k < h; ++ k){
bool flag = true;
for(int r = i + ; r <= j ; ++ r){
flag = flag && (board[k][r]!=board[k][r-]);
}
row[k] = (flag ? board[k][i] : 'X');
} int maxHeight = , cntHeight = ;
for(int k = ; k < h ; ++ k){
if(row[k] == 'X') cntHeight =;
else if((cntHeight > ) && row[k] != row[k-]) cntHeight ++;
else cntHeight = ;
maxHeight = max(cntHeight,maxHeight);
}
res = max(res,maxHeight*(j-i+));
}
}
return res;
}

topcoder SRM 610 DIV2 TheMatrix的更多相关文章

  1. topcoder SRM 610 DIV2 DivideByZero

    题目的意思是给你一组数,然后不断的进行除法(注意是大数除以小数),然后将得到的结果加入这组数种然后继续进行除法, 直到没有新添加的数为止 此题按照提议模拟即可 注意要保持元素的不同 int Count ...

  2. topcoder srm 610 div2 250

    第一次做tc 的比赛,一点也不懂,虽然题目做出来了, 但是,也没有在比赛的时候提交成功.. 还有,感谢一宁对tc使用的讲解.. 贴一下代码..... #include <cstring> ...

  3. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...

  4. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  5. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  6. Topcoder srm 632 div2

    脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...

  7. topcoder srm 610 div1

    problem1 link 计算每个格子向上的最大高度.然后每个格子同一行前面的格子以及当前格子作为选取的矩形的最后一行,计算面积并更新答案. problem2 link 对于两个数据$(x_{1}, ...

  8. topcoder srm 610

    div1 250pt: 题意:100*100的01矩阵,找出来面积最大的“类似国际象棋棋盘”的子矩阵. 解法:枚举矩阵宽(水平方向)的起点和终点,然后利用尺取法来找到每个固定宽度下的最大矩阵,不断更新 ...

  9. topcoder SRM 628 DIV2 BracketExpressions

    先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> # ...

随机推荐

  1. ASP.NET MVC中的Razor语法

    1.Razor的基本语法 @* 多行代码时需要包含在大括号内{}和每句代码后都需要加分号; *@ @{ ViewBag.Title = "Index"; ViewBag.Name ...

  2. Delphi编程建议遵守的规范1---缩进、各种语句的用法

    在编程时候,尤其是在一个大的团队里面,遵守统一的编程规范是极其重要的.为所有的开发人员制定一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致的格式,这样,每个编程人员编写的代码能够被其 ...

  3. LightOJ 1030 Discovering Gold(期望 概率)

    正推,到达i的概率为p[i],要注意除了1和n外,到达i的概率并不一定为1 概率表达式为p[i] += p[j] / min(n - j, 6) 从j带过来的期望为exp[i] += exp[j] / ...

  4. PHP计算程序运行时间的类

    <?php class runTime{ private $starTime; private $stopTime; private function getMicTime(){ $mictim ...

  5. C# 创建Windows Service

    当我们需要一个程序长期运行,但是不需要界面显示时可以考虑使用Windows Service来实现.这篇博客将简单介绍一下如何创建一个Windows Service,安装/卸载Windows Servi ...

  6. Linux下常用命令

    1.判断桌面环境是Gnome还是KDE #update-alternatives --display x-session-manager

  7. APP交互

    交互设计基本功!5个值得学习的APP交互方式http://www.uisdc.com/5-interactive-design-worth-learning 移动App交互设计10大趋势–你用到了吗? ...

  8. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  9. ubuntu12.04 安装eclipse

    1:去官网下载最新版的eclipse for linux; 2:cd  /usr/local 用命令 sudo mkdir eclipse 建立一个Eclipse的目录 3:将下载的文件copy到ec ...

  10. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...