zoukankan      html  css  js  c++  java
  • P1387 最大正方形+P1736 创意吃鱼法(矩形上的dp+预处理)

    最大正方形

     1 //找出一个01矩阵中最大的全为一的正方形,并输出边长
     2 #include <iostream>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<algorithm>
     8 #include<cmath>
     9 #define LL long long
    10 using namespace std;
    11 int mp[109][109];
    12 int f[109][109];
    13 int m,n;
    14 
    15 int main()
    16 {
    17     cin>>n>>m;
    18     for(int i=1;i<=n;i++)
    19     {
    20         for(int j=1;j<=m;j++)
    21         {
    22             cin>>mp[i][j];
    23         }
    24     }
    25     int res=0;
    26     for(int i=1;i<=n;i++)
    27     {
    28         for(int j=1;j<=m;j++)
    29         {
    30             if(mp[i][j])
    31                 f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;//若为一,则从三个方向中选个最小的(不然可能不符合题意)
    32             else
    33                 f[i][j]=mp[i][j];//是0就填0 
    34             res=max(f[i][j],res);
    35         }
    36     }
    37     cout<<res;
    38     return 0;
    39 }

    创意吃鱼法

     1 //类似于P1387最大正方形
     2 //磁体是让你找出一个01矩阵中最大的单位方阵,输出边长
     3 #include<iostream>
     4 #include<cstring>
     5 using namespace std;
     6 const int N=3000;
     7 bool mp[N][N];
     8 int s1[N][N],s2[N][N];//s1表示横向有多少个0,s2表示纵向有多少个0 
     9 int f[N][N];//方阵边长
    10 int main(void)
    11 {
    12     std::ios::sync_with_stdio(false);
    13     int n,m;
    14     cin>>n>>m;
    15     for(int i=1;i<=n;i++)
    16     {
    17         for(int j=1;j<=m;j++)
    18         {
    19             cin>>mp[i][j];
    20         }
    21     }
    22     //左上到右下
    23     memset(s1,0,sizeof(s1));
    24     memset(s2,0,sizeof(s2));
    25     memset(f,0,sizeof(f));
    26     int ans=0;
    27     for(int i=1;i<=n;i++)
    28     {
    29         for(int j=1;j<=m;j++)
    30         {
    31             if(mp[i][j]==0)
    32             {
    33                 s1[i][j]=s1[i][j-1]+1;
    34                 s2[i][j]=s2[i-1][j]+1;
    35             }
    36             else
    37             {
    38                 f[i][j]=min(f[i-1][j-1],min(s1[i][j-1],s2[i-1][j]))+1;
    39                 ans=max(ans,f[i][j]);
    40             }
    41         }
    42     }
    43     //右上到左下
    44     memset(s1,0,sizeof(s1));
    45     memset(s2,0,sizeof(s2));
    46     memset(f,0,sizeof(f));
    47     for(int i=1;i<=n;i++)
    48     {
    49         for(int j=m;j>=1;j--)
    50         {
    51             if(mp[i][j]==0)
    52             {
    53                 s1[i][j]=s1[i][j+1]+1;//此处当注意,右上到左下横向应该是加一
    54                 s2[i][j]=s2[i-1][j]+1;
    55             }
    56             else
    57             {
    58                 f[i][j]=min(f[i-1][j+1],min(s1[i][j+1],s2[i-1][j]))+1;
    59                 ans=max(ans,f[i][j]);
    60             }
    61         }
    62     }
    63     cout<<ans<<endl;
    64     return 0;
    65 }
  • 相关阅读:
    Object Files (.obj)
    使用IIS Microsoft的web服务器和ftp服务器
    关于matlab
    char, signed char, unsigned char的区别
    百度面试
    google笔试题_2011
    ioctl 函数与网络接口
    Unity之热更新:(三)XLua
    C#之设计模式:观察者模式
    C#:委托
  • 原文地址:https://www.cnblogs.com/greenofyu/p/12236157.html
Copyright © 2011-2022 走看看