1 条题解

  • 0
    @ 2025-8-24 21:28:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zhylj
    人生输家

    搬运于2025-08-24 21:28:29,当前版本为作者最后更新于2017-09-09 12:08:26,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    设f[i][j]为以(i,j)为右下角的最大符合条件正方形

    我们发现能吃到的鱼的数量等于边长,所以:

    三条绿色直线的长度分别记录为m1,m2,m3(保证绿色的地方都为0,黄色和灰色的地方都为1,m2m3为横,m1为竖线)

    那么,在f[i-1][j-1]≥1时,f[i][j]=min{f[i-1][j-1],min{m1,m3}}+1;

    f[i][j]=min(f[i-1][j+1],min(m1,m2))+1

    在f[i-1][j+1]≥1时,f[i][j]=min{f[i-1][j-1],min{m1,m2}}+1;

    (其实本来如果两个都符合还要比个max,但由于数据过水,导致我忽略了这点也可以过)

    最后遍历f数组,找最大即可。

    核心代码:

        for(int i=1;i<n;i++)
            for(int j=0;j<m;j++)
                if(((j-1>=0&&f[i-1][j-1]>=1)||(j+1<m&&f[i-1][j+1]>=1))&&a[i][j]==1)  //如果符合条件
                {
                    m1=0;m2=0;m3=0;  //清零变量
                    for(int k=i-1;k>=0&&a[k][j]==0;k--,m1++);  //寻找m1
                    for(int k=j+1;k<m&&a[i][k]==0;k++,m2++);  //寻找m2
                    for(int k=j-1;k>=0&&a[i][k]==0;k--,m3++);  //寻找m3
                    f[i][j]=f[i-1][j-1]>=1? min(f[i-1][j-1],min(m1,m3))+1:min(f[i-1][j+1],min(m1,m2))+1;  //计算
    }
    
    • 1

    信息

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