UVa OJ 12265 - Selling Land
来源:互联网 发布:淘宝信誉刷到皇冠 编辑:程序博客网 时间:2024/05/17 21:05
UVa OJ 12265 - Selling Land
Problem
输入一个n*m(1≤n,m≤1000)矩阵,每个格子可能是空地,也可能是沼泽。对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次。
Input
On the first line a positive integer: the number of test cases, at most 100. After that per test case:
- One line with two integers n and m (1 ≤ n, m ≤ 1000): the dimensions of Per’s parcel.
- n lines, each with m characters. Each character is either ‘#’ or ‘.’. The j-th character on the i-th line is a ‘#’ if position (i, j) is a swamp, and ‘.’ if it is grass. The north-west corner of Per’s parcel has coordinates (1, 1), and the south-east corner has coordinates (n, m).
Output
Zero or more lines containing a complete list of how many parcels of each perimeter Per needs to sell in order to maximize his profit. More specifically, if Per should sell pi parcels of perimeter i in the optimal solution, output a single line ‘pixi’. The lines should be sorted in increasing order of i. No two lines should have the same value of i, and you should not output lines with pi = 0.
Sample Input
16 5..#.#.#...#..##...#.#....#..#.
Sample Output
6 x 45 x 65 x 83 x 101 x 12
Solution
My code is inefficient, it takes about 2s to run.
The main idea is to handle the problem is creating arrays or whatever to record the length(height) of each blocks. And then caculate the circumference of them.
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1005;int cas, n, m, maxCircum, minLength;char land[maxn][maxn];int landLen[maxn][maxn], idx[maxn << 2];int main() { ios::sync_with_stdio(false); cin.tie(0); //freopen("input.txt" , "r", stdin ); //freopen("output.txt", "w", stdout); cin >> cas; while(cas--) { memset(idx, 0, sizeof(idx)); maxCircum = 0; cin >> n >> m; for (int i = 1; i <= n; ++i) cin >> land[i]+1; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (land[i][j] != '#') landLen[i][j] = landLen[i-1][j] + 1; else landLen[i][j] = 0; } } for (int i = n; i > 0; --i) { for (int j = m; j > 0; --j) { if (landLen[i][j]) { int Max = (landLen[i][j]+1) << 1; minLength = landLen[i][j]; for (int k = j-1; k > 0 && landLen[i][k]; --k) { minLength = min(minLength, landLen[i][k]); int tmp = j-k+1+minLength << 1; Max = max(Max, tmp); } ++idx[Max]; maxCircum = max(Max, maxCircum); } } } for (int i = 4; i <= maxCircum; ++i) if (idx[i]) printf("%d x %d\n", idx[i], i); } return 0;}
- UVa OJ 12265 - Selling Land
- UVA 12265 Selling Land
- UVA-12265 Selling Land
- UVA 12265 Selling Land
- uva 12265 - Selling Land(dp)
- UVA - 12265 Selling Land 分析
- UVa 12265:Selling Land(单调栈)
- 12265 - Selling Land
- UVa 12265 Selling Land 解题报告(降维)
- 12265 - Selling Land(单调队列)
- SPOJ 8628 Selling Land
- uva12265 selling land
- UVALive 4950 Selling Land
- 【UVa12265】Selling Land 贩卖土地
- UVa 516-Prime Land
- UVa 10074 - Take the Land
- UVa:10074 Take the Land
- UVa 10074 - Take the Land
- auto,register,extern,static使用及区别
- CocoPods基本使用
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
- Codeforces Round 341D
- 通用Adapter设计,SparseArray+泛型+回调的使用
- UVa OJ 12265 - Selling Land
- Java数组
- HTTP协议入门
- Ubuntu安装和配置SVN
- (C++水过去的)Power of Cryptography
- java反射机制创建对象
- 如何使用Material Design中的BottomSheetBehavior、BottomSheetDialog和BottomSheetDialogFragment
- 9,字符串类型的转换
- Android开发技巧——设置系统状态栏颜色