Matrix Swapping II(求矩阵最大面积,dp)

Matrix Swapping II

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1543    Accepted Submission(s): 1036

Problem Description

Given an N * M matrix with each entry equal to 0 or 1. We can find some rectangles in the matrix whose entries are all 1, and we define the maximum area of such rectangle as this matrix’s goodness. 
We can swap any two columns any times, and we are to make the goodness of the matrix as large as possible.

Input

There are several test cases in the input. The first line of each test case contains two integers N and M (1 ≤ N,M ≤ 1000). Then N lines follow, each contains M numbers (0 or 1), indicating the N * M matrix

Output

Output one line for each test case, indicating the maximum possible goodness.

Sample Input

3 4
1011
1001
0001
3 4
1010
1001
0001

Sample Output

4
2

Note: Huge Input, scanf() is recommended.

题解:

也是求最大矩阵的,只不过可以相互交换任意两列。

访问每一行时,求出每个点的高度,然后排序,以该点为高时的宽度就很容易看出来,面积取最大的就可以了。

ans=max(ans,(k-j+1)*s[j]);由于可以交换列,这里随着往右走,宽度逐渐减小,找最大值;

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x) scanf("%lf",&x)
#define P_ printf(" ")
typedef long long LL;
const int MAXN=1010;
char mp[MAXN][MAXN];
int dp[MAXN][MAXN];
int s[MAXN];
int main(){
    int N,M;
    while(~scanf("%d%d",&N,&M)){
        mem(dp,0);
        int ans=0;
        for(int i=1;i<=N;i++){
            scanf("%s",mp[i]);
            for(int j=M;j>=1;j--){
                mp[i][j]=mp[i][j-1];
            }
        }
        for(int i=1;i<=N;i++){
            int k=0;
            for(int j=1;j<=M;j++){
                if(mp[i][j]==‘1‘){
                    dp[i][j]=dp[i-1][j]+1;
                    s[++k]=dp[i][j];
                }
            }
            sort(s+1,s+k+1);
            for(int j=1;j<=k;j++){
                ans=max(ans,(k-j+1)*s[j]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-25 05:50:51

Matrix Swapping II(求矩阵最大面积,dp)的相关文章

HDU 2830 Matrix Swapping II (DP,最大全1矩阵)

题意  给你一个n*m矩阵  每列都可以随便交换位置   求最优交换后最大的全1子矩阵 又是HDU 1505 1506的变种  但这个更容易了  因为每列都可以交换位置了   那么这一行中所有比i高的都可以与i相邻了  只需要统计这一行有多少个比i高就行了   可以在算出每一行后  把高度大的放前面去  用num[i]记录排序后的列原来的数  这样就有j列比h[i][num[j]]高了  最后的答案也就是max(j*h[i][num[j]]) #include<cstdio> #include

HDU 2830 Matrix Swapping II (预处理的线性dp)

Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1430    Accepted Submission(s): 950 Problem Description Given an N * M matrix with each entry equal to 0 or 1. We can find som

HDU 2830 Matrix Swapping II (最大完全子矩阵之可移动列)

Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1210    Accepted Submission(s): 804 Problem Description Given an N * M matrix with each entry equal to 0 or 1. We can find som

HDU 2830 Matrix Swapping II

给一个矩阵,依然是求满足条件的最大子矩阵 不过题目中说任意两列可以交换,这是对题目的简化 求出h数组以后直接排序,然后找出(col-j)*h[j]的最大值即可(这里的j是从0开始) 因为排序会影响到h数组下一行的求解,所以将h数组中的元素复制到temp数组中去,再排序 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algori

HDU 1542 Atlantis (线段树求矩阵覆盖面积)

题意:给你n个矩阵求覆盖面积. 思路:看了别人的结题报告 给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1).(x2,y2),对这样的一个矩形,我们构造两条线段,一条定位在x1,它在y坐标的区间是[y1,y2],并且给定一个cover域值为1:另一条线段定位在x2,区间一样是[y1,y2],给定它一个cover值为-1.根据这样的方法对每个矩形都构造两个线段,最后将所有的线段根据所定位的x从左到右进行排序 #include <iostream> #include <stdio.h

HDu 2830 Matrix Swapping II(dp)

Problem Description Given an N * M matrix with each entry equal to 0 or 1. We can find some rectangles in the matrix whose entries are all 1, and we define the maximum area of such rectangle as this matrix's goodness. We can swap any two columns any

hdu 2830 Matrix Swapping II dp 动态规划

//这题和之前的2870题意相似,不过多了可以任意交换两列的功能 //先开始没看见能交换两列...结果裸的样例都没过,最后想了想//任意交换两列,那我们就可以直接对第i行第j列得到的cnt[i][j] //这一行惊醒排序就可以了,其中cnt[i][j]表示前i行第j列有多少 //个相同的1,进行降序排序得到a[j],那么a[j]*j的最大值就是我 //们所要的答案,因为j前面的肯定是高于j的. //注释部分是我之前的2870的裸的代码,具体可以看我的博客dp46道专题  //哎,继续练吧...

UVALive 3029 City Game 悬线法求最大子矩阵面积 dp

题目链接:点击打开链接 Bob is a strategy game programming specialist. In his new city building game the gaming environment is as follows: a city is built up by areas, in which there are streets, trees, factories and buildings. There is still some space in the a

HDU 2830 Matrix Swapping II(最大完全子矩阵之可移动列)

/* 题意: 给你一个矩阵,里面的数字只有0和1两种,其中,列可以任意移动.问如何移动可以使某个子矩阵中元素全部是1,求出这个最大子矩阵的面积. 对每一行进行处理然后再叠加,到每一行用num[i]记下到这一行有多少个1 例如: 1 0 1 1 num[i]的记录就是: 1 0 1 1 1 0 0 1 2 0 0 2 0 0 0 1 0 0 0 3 然后对num[i]从大到小排一下,求出读取到当前行能够得到的最大面积. 也就是最右边放着最多的1,依次类推.那么当前最大的面积就是 MAX(max,n