题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505

分析:
这题是HDU 1506 的加强版,定义一个二维数组,d[i][j]表示第i行j列元素在前i行中的最大高度。(以第一行为底)例如测试样例:
0 1 1 1 1 1                                                 0 1 1 1 1 1
1 1 1 1 1 1           (F=1,R=0,方便求和)        1 2 2 2 2 2
0 0 0 1 1 1           转化完就是右边矩阵            0 0 0 3 3 3
1 1 1 1 1 1                                                 1 1 1 4 4 4
1 1 1 1 1 1                                                 2 2 2 5 5 5
当然也有比较简单的以第一列为底,这样就可以在读取数据的循环中把a[i][j]赋值。
接下来就和 HDU 1506 一样了,逐行求最大矩形面积。
动态方程:l[j] r[j]分别表示左边界与右边界。(见上一篇:HDU 1506 Largest Rectangle in a Histogram)
l[j]=l[l[j]-1];
r[j]=r[r[j]-1];
 
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define inf 1<<30
using namespace std;
char s[][];
int a[][],l[],r[];
int main()
{
int T,t,n,m;
cin>>T;
while(T--)
{
cin>>n>>m;
memset(a,,sizeof(a));
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
cin>>s[i][j];
}
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{ if(s[i][j]=='F')a[i][j]=a[i-][j]+;
else a[i][j]=;
}
int ans=-;
for(int i=;i<=n;i++)
{
l[]=;r[m]=m;
for(int j=;j<=m;j++)
{
t=j;
while(t>&&a[i][j]<=a[i][t-])t=l[t-];
l[j]=t;
}
for(int j=m-;j>=;j--)
{
t=j;
while(t<m&&a[i][j]<=a[i][t+])t=r[t+];
r[j]=t;
}
for(int j=;j<=m;j++)
ans=max(ans,(r[j]-l[j]+)*a[i][j]);
}
printf("%d\n",ans*);
}
}

hdu1505(dp求最大子矩阵)的更多相关文章

  1. hdu 2870(dp求最大子矩阵)

    题意:让你求的是由同一字母组成的最大子矩阵,w可以变成a或者b,x可以变成b或者c,y可以变成a或者c,z可以变成a或者b或者c. 分析:这是hdu 1506.hdu 1505的加强版,具体的分析看我 ...

  2. hdu 1505(dp求最大子矩阵)

    题意:就是让你求出全由F组成的最大子矩阵. 分析:这是hdu 1506的加强版,只不过这道题变成了2维的,那我们就一行一行的来.具体的分析见1506的博客:http://www.cnblogs.com ...

  3. hdu 1506(dp求最大子矩阵)

    题意:容易理解... 分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1:我们从左到 右扫一遍,求出每个点的 ...

  4. hdu1506(dp求最大子矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 分析: 对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下 ...

  5. hdu2870(dp求最大子矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2870 分析:分别转换成'a','b','c'三种来求,其实就跟hdu1505一样了... #inclu ...

  6. hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))

    # include <stdio.h> # include <algorithm> # include <iostream> # include <math. ...

  7. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

  8. poj 1050 To the Max_dp求最大子矩阵和

    题意:求最大子矩阵和 利用dp[i]每次向下更新,构成竖起的单条矩阵,再按不小于零就加起来来更新,构成更大的矩阵 #include <iostream> #include<cstdi ...

  9. POJ1050To the Max(求最大子矩阵)

    题目链接 题意:给出N*N的矩阵,求一个子矩阵使得子矩阵中元素和最大 分析: 必备知识:求一组数的最大连续和 int a[N]; ,maxn = -INF; ; i <= n; i++) { i ...

随机推荐

  1. IOS开发之UIView的基本使用

    一.视图 1. iphone手机上的窗口就是UIWindow类的一个实例(1个手机应用只有一个UIWindow). 2.UIView类用于实现视图. UIView提供了方法来添加和删除子视图.一个视图 ...

  2. Delphi中多标签页面的实现

    unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. js点击button按钮跳转到另一个新页面

    点击按钮怎么跳转到另外一个页面呢?我们在网站制作中可能是需要的,因为有时我们需要做这样的效果,尤其是将按钮做成一个图片,而点击图片要跳转到新的页面时,怎么做到呢? 这样的效果可以:onclick=&q ...

  4. form里两个submit按钮,在onsubmit中判断哪个被点

    记下别人的解决方法(有效): 方法1:(已验证过) <form name="form1" onsubmit="show()"> ..... < ...

  5. cocos2d-x游戏开发系列教程-坦克大战游戏启动界面的编写

    用前面介绍的方法,创建一个cocos2d-x项目,可以看到新项目内容如下图:

  6. Servlet的学习之Request请求对象(1)

    在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法. 在本篇中先对Htt ...

  7. Linux版EPUB阅读器

    Linux版EPUB阅读器 如果说用平板电脑看书尚属主流的话,那么在电脑上读书就非常少见了.专注阅读16世纪的书是非常困难的了,没人希望后台蹦出QQ聊天窗口.但是如果你非要在电脑上打开电子书的话,那么 ...

  8. hdu 4710 Balls Rearrangement 数论

    这个公倍数以后是循环的很容易找出来,然后循环以内的计算是打表找的规律,规律比较难表述,自己看代码吧.. #include <iostream> #include <cstdio> ...

  9. Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  10. 汉字转拼音再转ASCII

    汉字能够转成拼音.能够在转成ASCII码,然后就能够转成十六进制数,再就能够转成0和1组成的二进制帧了! 比方说: 我爱你 -> wo ai ni -> 119 111 32 97 105 ...