一开始把题目意思理解错啦,做那好久没做出来。本题是一个dp问题;题目说列可以无限次对换,设矩阵为M[i][j],要找到面积大的矩形其实就是处理连续1的个数问题,用d[i][j](i表示行,j表示列)表示第i行从元素M[i][j]按列向下连1的个数,然后数组d[i]表示啦第i行向下连续1的个数的集合,对d[i]做一次sort从小到大排序,得到高度为d[i][1]到d[i][n]底边长度为1的小矩形,然后以第i行为基构成矩形的最大面积为s[i]=max{(n+1-j)*d[i][j]}(0<j<n+1),通过d[i][j]的意义可知:

if(M[i][j]==0)  d[i][j]=0;if(M[i][j]==1) d[i][j]=d[i+1][j],计算d[i][j]的方法为从后向前,一步一步计算。算法时间复杂度为n*mlogn

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define max 1002
int M[max][max];
int dp[max][max];
int DP(int m, int n);
int main(){
int i, j, m, n;
string s;
while (cin >> m >> n){
for (i = 1; i <= m; i++){
cin >> s;
for (j = 0; j < n; j++)
M[i][j + 1] = s[j] - '0';
}
cout<<DP(m, n) << endl;
}
return 0;
}
int DP(int m, int n){
int i, j;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= n; i++)
dp[m][i] = M[m][i];
for (i = m - 1; i >= 1; i--)
for (j = 1; j <= n; j++){/*从下向上计算d[i][j]*/
if (!M[i][j])
dp[i][j] = 0;
else
dp[i][j] = dp[i + 1][j] + 1;
}
int Max = 0;
for (i = 1; i <= m; i++){
sort(dp[i] + 1, dp[i] + n + 1); //对每一行的d[i][j]排序
for (j = 1; j <= n; j++) /*遍历每一行,找出最大面积存入Max*/
if (Max < dp[i][j] * (n + 1 - j))
Max = dp[i][j] * (n + 1 - j);
}
return Max;
}

HDU2830的更多相关文章

  1. hdu2830 可交换行的最大子矩阵

    题意:       求最大子矩阵,但是相邻的列之间可以相互交换... 思路:       回想下固定的情况,记得那种情况是开俩个数组 L[i] ,R[i],记录小于等于i的最左边和最右边在哪个位置,对 ...

随机推荐

  1. ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹

    前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙. 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 #include "Ex ...

  2. DirectShow简单入门程序

    1.首先确认已安装过相关工具及配置环境,然后打开vs2010,新建一对话框应用程序 取名为Player_test1,然后打开菜单->项目->属性-> 添加strmmiids.lib库 ...

  3. hnust CZJ-Superman

    问题 B: CZJ-Superman 时间限制: 1 Sec  内存限制: 128 MB提交: 636  解决: 87[提交][状态][讨论版] 题目描述 “那是只鸟?那是飞机?那是——超人!” 程序 ...

  4. Leetcode 611.有效三角形的个数

    有效三角形的个数 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 ...

  5. 打开任意位置的webConfig

    请阅读原文:打开任意的配置文件 翻翻ConfigurationManager的签名,有一个方法吸引了我的注意:OpenExeConfiguration(string exePath).看上去我可以把B ...

  6. Java之implements

    转自:https://blog.csdn.net/android_lover2014/article/details/52176814 JAVA中extends 与implements有啥区别?1. ...

  7. Hadoop入门第四篇:手动搭建自己的hadoop小集群

    前言 好几天没有更新了,本来是应该先写HDFS的相关内容,但是考虑到HDFS是我们后面所有学习的基础,而我只是简单的了解了一下而已,后面准备好好整理HDFS再写这块.所以大家在阅读这篇文章之前,请先了 ...

  8. hihoCoder #1763 道路摧毁

    题目大意 A 国一共有 $n$ 个城市且有 $n-1$ 条双向道路,且任意两个城市都可以通过道路互相到达. 现在 B 国给出了两个城市的集合 $X,Y$,你需要摧毁若干条 A 国的道路,使得任意一个在 ...

  9. ZOJ 2676 Network Wars(最优比例最小割)

    Network Wars Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge Network of Bytelan ...

  10. HDU 5889 Barricade(最短路+最小割水题)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...