zoukankan      html  css  js  c++  java
  • 找子矩阵

    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
  • 相关阅读:
    enumerate函数和zip函数返回的对象,都需要用list()函数转换为列表
    zip函数
    列表和元组的互相转换
    元组和列表的区别
    帮小朋友写的第一个程序
    remove del pop的区别
    如何运用Linux进行查看tomcat日志
    Linux大全
    liunx中组合查询的命令
    常见的问题
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/10295676.html
Copyright © 2011-2022 走看看