UVALive 3029 City Game 悬线法求最大子矩阵面积 dp

题目链接:点击打开链接

Bob is a strategy game programming specialist. In his new city building game the gaming environment is as follows: a city is built up by areas, in which there are streets, trees, factories and buildings. There is
still some space in the area that is unoccupied. The strategic task of his game is to win as much rent money from these free spaces. To win rent money you must erect buildings, that can only be rectangular, as long and wide as you can. Bob is trying to find
a way to build the biggest possible building in each area. But he comes across some problems ? he is not allowed to destroy already existing buildings, trees, factories and streets in the area he is building in.

Each area has its width and length. The area is divided into a grid of equal square units. The rent paid for each unit on which you‘re building stands is 3$.

Your task is to help Bob solve this problem. The whole city is divided into K areas. Each one of the areas is rectangular and has a different grid size with its own length M and width N. The existing occupied units
are marked with the symbol R. The unoccupied units are marked with the symbol F.

Input

The first line of the input file contains an integer K ? determining the number of datasets. Next lines contain the area descriptions. One description is defined in the following way: The first line contains
two integers-area length M<=1000 and width N<=1000, separated by a blank space. The next M lines contain N symbols that mark the reserved or free grid units, separated by a blank space. The symbols used are:

R ? reserved unit

F ? free unit

In the end of each area description there is a separating line.

Output

For each data set in the input file print on a separate line, on the standard output, the integer that represents the profit obtained by erecting the largest building in the area encoded by the data set.

Sample Input

2
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F

5 5
R R R R R
R R R R R
R R R R R
R R R R R
R R R R R

Sample Output

45
0

题意:求全由F构成的最大的矩阵面积(答案*3后输出)

思路:求每个点 能往上延展的最大高度,按此高度往左和往右延展的最大距离。

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeSet;
import java.util.Queue;

public class Main {
	static int N = 1010;
	int n, m;
	boolean[][] mp = new boolean[N][N];
	int[][] up = new int[N][N], left = new int[N][N], right = new int[N][N];
	void init(){
		n = cin.nextInt();	m = cin.nextInt();
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= m; j++)
			{
				String s = cin.next();
				mp[i][j] = s.charAt(0)=='R';
			}
		}
	}
	void work() {
		int T = cin.nextInt();
		while(T-- > 0) {
			init();
			for(int i = 1; i <= n; i++)
			{
				left[i][0] = up[i][0] = 0;
				for(int j = 1; j <= m; j++)
				{
					if(mp[i][j])
					{
						left[i][j] = up[i][j] = 0;
					}
					else
					{
						up[i][j] = up[i-1][j]+1;
						left[i][j] = 1;
						if(up[i][j]<=up[i][j-1])
							left[i][j] = left[i][j-1]+1;
					}
				}
				right[i][m+1] = up[i][m+1] = 0;
				for(int j = m; j >= 1; j--)
				{
					if(mp[i][j])
						right[i][j] = 0;
					else
					{
						right[i][j] = 1;
						if(up[i][j]<=up[i][j+1])
							right[i][j] = right[i][j+1]+1;
					}
				}
			}
			int ans = 0;
			for(int i = 1; i <= n; i++)
				for(int j = 1; j <= m; j++)
					ans = max(ans, up[i][j]*(left[i][j]+right[i][j]-1));
			out.println(ans*3);
		}
	}	

	Main() {
		cin = new Scanner(System.in);
		out = new PrintWriter(System.out);
	}

	public static void main(String[] args) {
		Main e = new Main();
		e.work();
		out.close();
	}
	public Scanner cin;
	public static PrintWriter out;

	int max(int x, int y) {
		return x > y ? x : y;
	}
}
时间: 2024-08-25 12:36:07

UVALive 3029 City Game 悬线法求最大子矩阵面积 dp的相关文章

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

bzoj 3039: 玉蟾宫 单调栈或者悬线法求最大子矩阵和

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'

BZOJ 3039 玉蟾宫 悬线法

题目大意:给出一张地图,求出这张地图中最大的子矩阵,使得这个子矩阵不包含字母'R'. 思路:简单的悬线法求最大子矩阵,还是不带权值的,很好求.好久没写悬线了,复习一下. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1010 using namespace std; int m,n; bool map[MAX][M

【BZOJ-3039&amp;1057】玉蟾宫&amp;棋盘制作 悬线法

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖

BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) + 1 (假如(i, j)和右边和下边不冲突) 第二问就是经典的悬线法解决最大子矩阵了, 维护悬线H[i][j], 左边右边延伸的最长距离.先一行一行求出这一行的L, R, 然后再从上往下扫, 维护H, L, R 写完我才发现我脑残了...最大的正方形一定是在最大子矩阵里面啊...所以其实不用dp.

重(zhong)新学习悬线法

2017.9.28今天模拟赛T1就是求最大子矩阵的经典题 然而我已经好久没有写悬线了,以前悬线也是拉的,于是现在就系统的学习一波吧 给定一个N * M的01矩阵,求最大全0矩阵的大小 N^3的做法其实有很多种,前缀和乱搞什么的都可以 考虑N^2的做法 对于任意一个非1的点i,j,记其向上能到达的最长长度为up[i][j] 显然up[i][j] = up[i-1][j] + 1 (a[i][j] == 0) up[i][j] = 0 (a[i][j] = 1)我们称up[i][j]为一条悬线 显然

【bzoj3039】玉蟾宫 悬线法

悬线法是一种更优秀的枚举方式,保证了枚举悬线的集合包含了极大子矩形所在的集合,而且由最大子矩形一定是极大子矩形的定理可知,这种枚举方式可以求出最大子矩形. 具体做法是维护矩形中每个元素对应最近的左边和右边的障碍点,再维护一个高度数组记录下每个点向上可以延伸多高,还有对应的矩形向左向右可以到达的最大宽度. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e3+10; int n,m,a[maxn][maxn];

悬线法——有套路的DP

例题 P1169 [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×88 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由N×MN \times MN×M个正方形的格子组成的矩形纸片,每个

Codevs 1159 最大全0子矩阵 悬线法!!!!

1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多. 输入描述 Input Description 输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开. 输出描述 Output Description 输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数.