【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; }