题解:(参考)在矩阵中寻找最大正方形连续区域
M中的每一个元素MijMij都有一个与之对应的数值maxijmaxij记录着以这个元素为左上角顶点的最大的一个正方形连续区域的大小(行/列 数)。 对元素MijMij有两种状态 Mij≠kMij≠k , 此时可以得出maxij=0maxij=0。 Mij=kMij=k , 此时可以得出maxij=min(max(i+1)j,maxi(j+1),max(i+1)(j+1))+1maxij=min(max(i+1)j,maxi(j+1),max(i+1)(j+1))+1。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 #include <vector> 7 #include <stack> 8 #include <map> 9 #include <set> 10 #include <queue> 11 #include <list> 12 #include <cstdlib> 13 #include <iterator> 14 #include <cmath> 15 #include <iomanip> 16 #include <bitset> 17 #include <cctype> 18 //#include <bits/stdc++.h> 19 20 using namespace std; 21 #define c_1(a) scanf("%d",&a) 22 #define c_2(a,b) scanf("%d%d",&a,&b) 23 #define c_3(a,b,c) scanf("%d%d%d",&a,&b,&c) 24 #define min_2(a,b) a<b?a:b 25 #define min_3(a,b,c) min_2(min_2(a,b),c) 26 #define max_2(a,b) a>b?a:b 27 #define max_3(a,b,c) max_2(max_2(a,b),c) 28 #define ll long long 29 #define rint register int 30 #define mem0(x) memset(x, 0, sizeof(x)) 31 #define mem1(x) memset(x, -1, sizeof(x)) 32 #define lowbit(x) x&-x 33 /**inline int read()///神奇的读优 34 { 35 int x=0,f=1;char c=getchar(); 36 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 37 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 38 return x*f; 39 }*/ 40 ///2147483647 -2147483648 41 ///9223372036854775807 -9223372036854775808 42 //freopen("input.txt", "r", stdin); 43 const double PI=acos(-1.0); 44 const int inf = 0x3f3f3f3f; 45 const ll inff = 0x3f3f3f3f3f3f3f3f; 46 const int mod=1000000007; 47 //map<ll,ll>mp; 48 //set<ll>st; 49 //stack<>st; 50 //queue<>Q; 51 /***********************************************/ 52 int a[5003][5003]; 53 int maxx[5004][5004]; 54 55 56 int main() 57 { 58 int n,m,k; 59 c_3(n,m,k); 60 while(k--) 61 { 62 int x,y; 63 c_2(x,y); 64 a[x][y]=-1; 65 } 66 ll sum=0; 67 for(int x=n;x>=1;x--) 68 { 69 for(int y=m;y>=1;y--) 70 { 71 if(a[x][y]==-1) maxx[x][y]=0; 72 else maxx[x][y]=min_3(maxx[x+1][y],maxx[x][y+1],maxx[x+1][y+1]),maxx[x][y]++; 73 sum+=maxx[x][y]; 74 } 75 } 76 printf("%lld ",sum); 77 return 0; 78 }