Codeforces 375B Maximum Submatrix 2 (DP)
<题目链接>
题目大意:
给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积。
#include <bits/stdc++.h> using namespace std; const int N = 5e3+5; int n,m; int dp[N][N]; char mpa[N][N]; int main(){ while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++)scanf("%s",mpa[i]+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(mpa[i][j]=='1')dp[j][i]=dp[j-1][i]+1; //在第i行内,以(i,j)这个点为末尾的最长连续1的数量 int ans=0; for(int i=1;i<=m;i++){ sort(dp[i]+1,dp[i]+1+n); //在第i列,将该列所有的dp[i]全部排序 for(int j=n;j>=1;j--) ans=max(ans,dp[i][j]*(n-j+1)); //因为这样能够保证以这一列为矩阵的右边界,同时当前行以下的所有行的连续的1的个数一定大于等于当前行,所以能够这样一直向上递推构建合法的全1矩阵,只需要不断更新答案即可 }printf("%d\n",ans); } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。