1 条题解

  • 0
    @ 2025-8-24 21:22:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 3493441984zz
    **

    搬运于2025-08-24 21:22:16,当前版本为作者最后更新于2019-02-12 20:38:55,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本蒟蒻只会n3n^3

    唉,还是太弱了,靠刷点水题过日子


    思路:

    我们枚举出矩形左下角的点,坐标为(i,j)(i,j),并且枚举这个点向右的长度kk,那么以(i,j)(i,j)为左下角,宽度为kj+1k-j+1的矩形自然就是能向上扩展的高度最小值了,光说可能不太清楚,下面模拟一下(有图哦qwqqwq

    我们以下面为例子,粗略讲一下(不会全部模拟)

    样例:

    44

    WWWWWWWW

    WWBWWWBW

    WWWWWWWW

    WWWWWWWW

    那么假设我们枚举i,ji,j分别为4,14,1,也就是第四行第一列,那么我们向右枚举kk

    k=1k=1时,我们求出以i,ji,j为左下角,宽度为kj+1k-j+1也就是11的矩形有多少个,我们可以看到有44个,分别是:

    我们其实可以发现就是能向上扩展的高度个矩形

    k=2k=2时,我们发现以i,ji,j为左下角,宽度为22的矩形也有44个,分别为:

    k=3k=3时,我们发现以i,ji,j为左下角,宽度为33的矩形有22个,分别为:

    k=4k=4时,我们发现以i,ji,j为左下角,宽度为44的矩形有22个,分别为:

    那么到这里我们就枚举出了左下角为4,14,1的所有矩形

    而且我们可以发现,矩形个数就是能向上扩展的高度

    那么我们会枚举i,ji,j,让每一个点作为矩形左下角,同时枚举宽度,一层一层下来,最后就是不遗漏的所有矩形个数,具体证明就省略了,自己想想就知道了

    时间复杂度O(n3)O(n^3)

    下面是美滋滋的代码时间~~~

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define N 157
    using namespace std;
    int n,now,ans;
    int high[N];
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i)
    	{
    		for(int j=1;j<=n;++j)
    		{
    			char in;
    			scanf(" %c",&in);
    			if(in=='W')
    				++high[j];
    			else
    				high[j]=0;
    		}
    		for(int j=1;j<=n;++j)
    		{
    			now=high[j];
    			for(int k=j;k<=n;++k)
    			{
    				if(!high[k])
    					break;
    				now=min(now,high[k]);
    				ans+=now;
    			}
    		}
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    192
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者