一维差分:d[i]=a[i]-a[i-1]
二维差分:d[i][j]=a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1]
一维前缀和:s[i]=s[i-1]+a[i]
二维前缀和:s[i][j]=a[i][j]-s[i-1][j-1]+s[i-1][j]+s[i][j-1]
前缀和
P1387 最大正方形(洛谷)
题目相当于求正方形区域内的所有值的和是否为
![]()
#include<bits/stdc++.h>
using namespace std;
int a[110][110],s[110][110],m,n,ans;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
s[i][j]=a[i][j]-s[i-1][j-1]+s[i-1][j]+s[i][j-1];
}
for(int l=min(m,n);l>=1;l--)
for(int i=1;i+l-1<=n;i++)
for(int j=1;j+l-1<=m;j++){
if(s[i+l-1][j+l-1]+s[i-1][j-1]-s[i-1][j+l-1]-s[i+l-1][j-1]==l*l){
ans=l,cout<<l;
return 0;
}
}
}