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;
}

原文地址:https://www.cnblogs.com/mysh/p/11561120.html

时间: 2024-07-30 09:02:20

UOJ #589. 图图的游戏的相关文章

#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

给他任何一套图图图u又哭了

夫人和翻译秃头一天又图图图5634564646464合格合格合格和非官方的活动符合东方给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭了给他任何一套图图图u又哭

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: 1 #include<stdio.h> 2 #include<queue> 3 #include<iostream> 4 using namespace std; 5 typedef struct{ 6 int Vex[10];//顶点表 7 int Edge[10][10]; 8 int vexnum,arcnum;

UOJ #79 一般图最大匹配

一般图最大匹配 从前一个和谐的班级,所有人都是搞OI的.有 \(n\) 个是男生,有 \(0\) 个是女生.男生编号分别为 \(1,-,n\). 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽.每个人至多属于一个小组. 有若干个这样的条件:第 \(v\) 个男生和第 \(u\) 个男生愿意组成小组. 请问这个班级里最多产生多少个小组? 输入格式 第一行两个正整数,\(n,m\).保证 \(n≥2\). 接下来 \(m\) 行,每行两个整数 \(v,u\) 表示第

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

题目 我是一个小沙比,爆零本领强~ T1 看起来是一道很捞的.做过无数遍的区间最大值. 直接$O(n^3)$做一做就完了…… 具体做法就是预处理每行的前缀和,然后二重循环枚举一个固定的列区间,再用单调队列的思想,从第一行不停向下扩展行区间,如果矩阵内总和$\gt k$ 了就从行区间顶部不停删行,删到矩阵内总和$\le k$ 为止.每当矩阵总和满足限制时,更新矩阵面积最大值即可. 当然如果你很想大战$T1$的话,可以写个$O(n^2*log(n^2))$的主席树? 1 #include<cmath

数据结构(五)图---图的存储结构5种

一:图的抽象数据类型 ADT 图(Graph) Data 顶点的有穷非空集合和边的集合 Operation CreateGraph(*G,V,VR):按照顶点集V和边弧集VR的定义构造图G DestroyGraph(*G):图G存在则销毁 LocateVex(G,u):若图G中存在顶点u,则返回图中位置 GetVex(G,v):返回图中顶点v的值 PutVex(G,v,value):将图G中顶点v赋值给value FirstAdjVex(G,*v):返回顶点v的一个邻接顶点,若顶点在G中无邻接顶

图——图的Prim法最小生成树实现

1,运营商的挑战: 1,在下图标出的城市间架设一条通信线路: 2,要求: 1,任意两个城市间都能够通信: 2,将架设成本降至最低: 2,问题抽象: 1,如何在图中选择 n - 1 条边使得 n 个顶点间两两可达,并且这 n - 1 条边的权值之和最小? 3,最小(大)生成树: 1,仅使用图中的 n - 1 条边连接图中的 n 个顶点: 2,不能使用产生回路的边: 3,各边上的权值总和达到最小(大): 4,寻找最小生成树: 5,使用 prim 方法手工寻找最小生成树: 6,最小生成树算法步骤(pr

图——图的Floyd法最短路径实现

1,Dijkstra 算法一次性求得起始顶点到所有其它顶点的最短路径,如果想要求解任意两个顶点之间的最短路径,可将图中顶点作为起始顶点执行 n 次 Dijkstra 算法就可以了: 2,可能解决方案: 1,算法执行结束后,i 到 j 最短路径值存储于 dist[i][j] 中.最短路径前驱结点存储于 path[N][N] 中: 2,这种方法比较土: 3,问题的提法: 1,已知一个各边权值均大于 0 的带权有向图,对每一对顶点 vi != vj,求出 vi 与 vj 之间的最短路径值以及最短路径上