uvalive3029(扫描图)

来源:互联网 发布:golang otter 编辑:程序博客网 时间:2024/04/25 18:35

题意:
给出一个矩阵,F代表空地,R代表障碍;问最大的空地矩阵(就有F组成的矩形)有多大,输出面积乘以3;
思路:
看了大白的思路;
就是扫描这张图,判断每一个点,它向上延伸,空地有多大,向左延伸,向右延伸空地有多大;然后就能计算这个点所在的矩形有多大,更新最大值即可:



#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1005;int g[N][N], up[N][N], left[N][N], right[N][N];int main() {int t;scanf("%d", &t);while(t--) {int m, n;scanf("%d%d", &m, &n);for(int i = 0; i < m; i++)for(int j = 0; j < n; j++) {int ch = getchar();while(ch != 'F' && ch != 'R') ch = getchar();g[i][j] = ch == 'F' ? 0 : 1;}int ans = 0;for(int i = 0; i < m; i++) {int l = -1, r = n;for(int j = 0; j < n; j++)if(g[i][j] == 1) { up[i][j] = left[i][j] = 0; l = j; }else {up[i][j] = i == 0 ? 1 : up[i - 1][j] + 1;left[i][j] = i == 0 ? l + 1 : max(left[i - 1][j], l + 1);}for(int j = n-1; j >= 0; j--)if(g[i][j] == 1) { right[i][j] = n; r = j; }else {right[i][j] = i == 0 ? r-1 : min(right[i-1][j], r - 1);ans = max(ans, up[i][j]*(right[i][j]-left[i][j]+1));}}printf("%d\n", ans*3);}return 0;}


0 0
原创粉丝点击