P1387 最大正方形+P1736 创意吃鱼法(矩形上的dp+预处理)

Posted greenofyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于P1387 最大正方形+P1736 创意吃鱼法(矩形上的dp+预处理)的主要内容,如果未能解决你的问题,请参考以下文章

P1736 创意吃鱼法

洛谷 P1736 创意吃鱼法

P1736 创意吃鱼法

洛谷P1736 创意吃鱼法

[洛谷] P1736 创意吃鱼法

[P1736]创意吃鱼法[DP]