zoukankan      html  css  js  c++  java
  • [BZOJ4506] [Usaco2016 Jan]Fort Moo(DP?)

    传送门

    总之可以先预处理出来每个位置最多往上延伸多少

    枚举两行,看看夹在这两行中间的列最大能构成多大的矩形

    可以看出,必须得在一个两行都没有X的区间才有可能构成最大的答案

    那么可以把这些区间处理出来,在看看这些区间中的点最左边和最右边的能从下面那一行向上延伸到上面那一行的点,更新ans即可

    #include <cstdio>
    #define N 201
    #define max(x, y) ((x) > (y) ? (x) : (y))
    
    int n, m, ans, p;
    int h[N][N], b[N];
    char s[N][N];
    
    int main()
    {
    	int i, j, k;
    	scanf("%d %d", &n, &m);
    	for(i = 1; i <= n; i++)
    	{
    		scanf("%s", s[i] + 1);
    		for(j = 1; j <= m; j++)
    			if(s[i][j] == '.')
    				h[i][j] = h[i - 1][j] + 1;	
    	}
    	for(i = 1; i <= n; i++)
    		for(j = i + 1; j <= n; j++)
    		{
    			p = -1;
    			for(k = 1; k <= m; k++) b[k] = h[j][k];
    			for(k = 1; k <= m; k++)
    				if(s[i][k] == 'X')
    					b[k] = 0;
    			for(k = 1; k <= m; k++)
    			{
    				if(!b[k]) p = -1;
    				if(j - b[k] < i && p == -1) p = k;
    				if(j - b[k] < i && p != -1) ans = max(ans, (k - p + 1) * (j - i + 1));
    			}
    		}
    	printf("%d
    ", ans);
    	return 0;
    }
    

      

  • 相关阅读:
    qsort()的使用
    c语言不寻常的类型转换(类型提升)
    堆栈段的三个主要用途
    区分 声明与定义
    宏定义陷阱与typedef
    约瑟夫环解决方案
    线程中断测试
    Redis
    本地缓存
    tomcat优化
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7597649.html
Copyright © 2011-2022 走看看