一开始把题目意思理解错啦,做那好久没做出来。本题是一个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. CentOS6.4编译Hadoop-2.4.0

      因为搭建Hadoop环境的时候,所用的系统镜像是emi-centos-6.4-x86_64,是64位的,而hadoop是默认是32的安装包.这导致我们很多操作都会遇到这个问题(Java HotSp ...

  2. Python面向对象之常用的特殊方法(5)

    Python面向对象里面有很多特殊方法,例如__init__(构造方法),__del__(析构方法),这些方法对于面向对象编程非常重要,下面列出一些常用的特殊方法 (1)__call__ class ...

  3. 删除 node 【笔记】

    sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receip ...

  4. 【bzoj4836】[Lydsy2017年4月月赛]二元运算 分治+FFT

    题目描述 定义二元运算 opt 满足   现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c  你需要求出有多少对 (i, j) 使得 a_ ...

  5. HDU 3333 Turing Tree(离线树状数组)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. EPPlus(SQL导成Excel)

    使用Epplus方法把sql数据库中表的数据导出到excel中去: 需要使用EPPlus.dll引用. using System.IO; using OfficeOpenXml; public sta ...

  7. 蔬菜(vegetable)

    蔬菜(vegetable) 题目描述 题目背景:您使用脚本刷出了上题游戏 998244353 关的最高分 (最优解),心满意足的准备点继续学习,忽然一条弹窗弹了出来:你想明白活着的意义吗?你想真正的. ...

  8. app自动测试-微信(iOS)-web-1

    appium 是一个用于app自动测试的工具.目前支持测试iOS, Android, Windows上的app.(github: https://github.com/appium/appium) 其 ...

  9. Ubuntu 硬盘大小扩展

    注:途中所有图均为配置好补的截图,部分来自其它网页. 1.选择硬盘(SCSI) 2.点击扩展,在弹出框填写期望的硬盘大小(不能比原硬盘大小容量小) 3.进入虚拟机,安装GParted. 命令:sudo ...

  10. BZOJ 3513: [MUTC2013]idiots

    3513: [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 476  Solved: 162[Submit][Stat ...