洛谷最大长方形
题目链接: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 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16079198.html