zoukankan      html  css  js  c++  java
  • 【Luogu】P1681最大正方形2(异或运算,DP)

    题目链接

    不得不说attack是个天才。读入使用异或运算,令que[i][j]^=(i^j)&1,于是原题目变成了求que数组的最大相同值。

    然而我还是不理解为啥,而且就算简化成这样我也不会做。

    ai,我太菜了。

    f[i][j]表示考虑到i,j为止的最大值。当que[i][j]=que[i-1][j]=que[i][j-1]=que[i-1][j-1]的时候,f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1.

    #include<cstdio>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    inline long long read(){
        long long num=0,f=1;
        char ch=getchar();
        while(!isdigit(ch)){
            if(ch=='-')    f=-1;
            ch=getchar();
        }
        while(isdigit(ch)){
            num=num*10+ch-'0';
            ch=getchar();
        }
        return num*f;
    }
    
    int que[1600][1600];
    int f[1600][1600];
    int ans;
    int main(){
        int n=read(),m=read();
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j){
                que[i][j]=read()^(i^j)&1;
                f[i][j]=1;
            }
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j){
                if(que[i][j]==que[i-1][j]&&que[i][j]==que[i][j-1]&&que[i][j]==que[i-1][j-1]){
                    f[i][j]=min(f[i][j-1],min(f[i-1][j],f[i-1][j-1]))+1;
                    ans=max(ans,f[i][j]);
                }
            }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    04邻接表深度和广度遍历DFS_BFS
    03邻接矩阵的深度和广度遍历的C语言实现
    02邻接表创建的C语言实现
    01邻接矩阵的创建C语言实现
    GUN的相关使用
    JAVA学习笔记
    排序的C语言实现
    线索二叉树的C语言实现
    maven配置logback
    多线程概念
  • 原文地址:https://www.cnblogs.com/cellular-automaton/p/7500091.html
Copyright © 2011-2022 走看看