1. 程式人生 > >全是1的最大子矩陣(DP)

全是1的最大子矩陣(DP)

【題目描述】 給出1個M*N的矩陣M1,裡面的元素只有0或1,找出M1的一個子矩陣M2,M2中的元素只有1,並且M2的面積是最大的。輸出M2的面積。

Input 第1行:2個數m,n中間用空格分隔(2 <= m,n <= 500) 第2 - N + 1行:每行m個數,中間用空格分隔,均為0或1。 Output 輸出最大全是1的子矩陣的面積。

Input示例 3 3 1 1 0 1 1 1 0 1 1 Output示例 4

【思路】 依然當成最大子矩陣和來做,只不過需要判斷一下當前矩陣是不是全1的即可

#include<bits/stdc++.h>
using namespace std;

const int maxn=505;

int n,m;
int g[maxn][maxn];

int main(){
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			scanf("%d",&g[i][j]);
			g[i][j]+=g[i-1][j];
		}
	}
	int ans=0;
	for(int i=1;i<=n;++i){
		for(int j=i;j<=n;++j){
			int cnt=0;
			for(int k=1;k<=m;++k){
				if(g[j][k]-g[i-1][k]!=j-i+1){
					ans=max(ans,cnt*(j-i+1));
					cnt=0;
				}
				else ++cnt;
			}
			ans=max(ans,cnt*(j-i+1));
		}
	}
	printf("%d\n",ans);
	return 0;
}