标签:
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1543 Accepted Submission(s): 1036
也是求最大矩阵的,只不过可以相互交换任意两列。
访问每一行时,求出每个点的高度,然后排序,以该点为高时的宽度就很容易看出来,面积取最大的就可以了。
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; }
Matrix Swapping II(求矩阵最大面积,dp)
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/5205158.html