HDU 2830 Matrix Swapping II
暴力枚举+DP预处理。
可以枚举矩形底边是哪一行,枚举到一行的时候,计算以该行为底边,最大矩形面积是多少。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=1000+10; char s[maxn][maxn]; int a[maxn][maxn]; int dp[maxn][maxn]; int tmp[maxn]; int n,m; int ans; void read() { for(int i=0;i<n;i++) scanf("%s",s[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=s[i-1][j-1]-'0'; } void init() { ans=0; memset(dp,0,sizeof dp); } void work() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]==0) dp[i][j]=0; else dp[i][j]=dp[i-1][j]+1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { tmp[j]=dp[i][j]; } sort(tmp+1,tmp+1+m); for(int i=1;i<=m;i++) ans=max(ans,(m-i+1)*tmp[i]); } printf("%d\n",ans); } int main() { while(~scanf("%d%d",&n,&m)) { read(); init(); work(); } return 0; }