UOJ #589. 图图的游戏

Posted mysh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UOJ #589. 图图的游戏相关的知识,希望对你有一定的参考价值。

【题目描述】:

图图正在玩一个智力游戏:有一个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;

 

 

以上是关于UOJ #589. 图图的游戏的主要内容,如果未能解决你的问题,请参考以下文章

2018.10.22图图的游戏 / 图图的设计 / 图图的旅行

uoj284 快乐游戏鸡

uoj384 HNOI2018 寻宝游戏

uoj#317[NOI2017]游戏 2-SAT

UOJ 266 清华集训2016Alice和Bob又在玩游戏

uoj#266. 清华集训2016Alice和Bob又在玩游戏(博弈论)