洛谷最大长方形

题目链接:https://www.luogu.com.cn/problem/P1387

有趣的dp思维题,可以一试;

题目思路:

dp三步走,设状态,转移方程,dp结果

设dp[i][j]为以i,j为左下点的正方形的最长边长;

第二步转移方程:

dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;

为什么要这样写,请看图片

图片转自大佬:https://www.luogu.com.cn/blog/Panthera/solution-p1387

然后边界条件的处理和一些转移的运算都在代码中啦:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[110][110];
 4 int a[110][110];
 5 int n,m;
 6 int ans;
 7 int main()
 8 {
 9     ios::sync_with_stdio(false);
10     cin>>n>>m;
11     for(register int i=1;i<=n;i++)
12     {
13         for(register int j=1;j<=m;j++)
14         {
15             cin>>a[i][j];
16         }
17     }
18     for(register int i=1;i<=n;i++)
19     {
20         for(register int j=1;j<=m;j++)
21         {
22             if(a[i][j]==1)//只有是1才可以处理哦 
23             {
24                 dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;//已经说过了,其实无非就是左,下和左下三个重要方向以及i,j本身一个点所贡献的边长 
25                 ans=max(ans,dp[i][j]);//每次求最大的边长 
26             }
27         }
28     }
29     cout<<ans<<endl;
30     return 0;
31 }

 

posted @ 2022-03-30 21:24  江上舟摇  阅读(24)  评论(0编辑  收藏  举报