找子矩阵

LZDFDSMLL吃批萨

题解:(参考)在矩阵中寻找最大正方形连续区域

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 }
View Code
原文地址:https://www.cnblogs.com/liuyongliu/p/10295676.html