题目的意思是给一个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. MVC - 10.CodeFrist

    微软示例 1.(对新数据库使用 Code First):http://msdn.microsoft.com/zh-cn/data/jj193542 2.(连接和模型):http://msdn.micr ...

  2. 全局压缩http响应头

    见代码: public class CompressAttribute : ActionFilterAttribute { public override void OnActionExecuting ...

  3. 在python多进程中使用manager和Barrier

    注意:Barrier是PYTHON3才有的功能,在2中无法测试. #!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessin ...

  4. ytu 1059: 判别该年份是否闰年(水题,宏定义)

    1059: 判别该年份是否闰年 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 139[Submit][Status][Web ...

  5. Oracle【IT实验室】数据库备份与恢复之五:Flashback

    Flashback在开发环境(有时生产环境的特殊情况下)是很有用的一个工具.     5.1 9i Flashback 简介     5.1.1  原理 当数据  update  或  delete  ...

  6. Shell脚本获取C语言可执行程序返回值

    #!/bin/sh #./test是c程序,该程序 返回0 ./test OP_MODE=$? echo $OP_MODE # $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误.

  7. Printf()输出格式控制(转)

    int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]typ ...

  8. wpf window set window的owner

        [DllImport("user32.dll")]   public static extern IntPtr GetAncestor(IntPtr hWnd, int f ...

  9. BPEL是个什么东东

    研究团队有个做智能服务组合的,其中用到叫BPEL的东西,因为全称是Business Process Execution Language,译成中文就是商业执行过程语言,这个东东的是整合SOA的一个执行 ...

  10. zTree学习文档和DEOM

    http://tool.oschina.net/apidocs/apidoc?api=ztree3.2%2Fapi%2FAPI_cn.html zTree的API http://www.ztree.m ...