【题目描述】:
图图正在玩一个智力游戏:有一个n×n 的01 方格,图图要从中选出一个面积最大的矩形区域,要求这个矩形区域不能有超过k个1。
这么难的问题图图当然不会做了,他想让你帮帮他,你能解决这个问题吗?
【输入描述】:
第一行包含2 个正整数n,k。
接下来n 行每行n 个整数,表示这个01方格。
【输出描述】:
输出1 个整数,表示最大面积。
【样例输入】:
5 4
1 0 1 0 1
0 1 0 0 0
1 0 1 0 0
1 1 1 1 1
0 0 1 0 1
【样例输出】:
12
【时间限制、数据范围及描述】:
时间:1s 空间:256M
对于40%的数据,1≤n≤10;
对于70%的数据,1≤n≤51;
对于100%的数据,1≤n≤501,0≤k≤n×n。
思路
暴力搜索,加一点优化(暴力完用尺取法取值),省去一轮循环
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=510; int f[N][N]; int map[N][N]; int n,kk,ans,sum; int main() { scanf("%d%d",&n,&kk); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d",&map[i][j]); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+map[i][j]; ans=-1; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { int l=1; for(int r=1; r<=n; r++) { while(f[j][r]-f[j][l-1]-f[i-1][r]+f[i-1][l-1]>kk&&l<=r) l++; if(l<=r) ans=max(ans,(j-i+1)*(r-l+1)); } } printf("%d\n",ans); return 0; }
原文地址:https://www.cnblogs.com/mysh/p/11561120.html
时间: 2024-10-01 10:16:42