题目链接:https://nanti.jisuanke.com/t/44
题意:数一数边长为1的正方形个数、长度为2的正方形个数,如果有就输出,没有就不输出
题解: 非常明显的递推,从正方形的右下角推到正方形的左上角,dp[i][j]保存当前位置的正方形的边长最小值,num[i]表示边长为i的正方形的个数(有边长为2的正方形就一定有边长为1的正方形
dp[i][j]=min(dp[i+1][j+1],min(dp[i+1][j],dp[i][j+1])
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int maxn = 505; int Min(int a,int b,int c){ return min(min(a,b),c); } char mp[maxn][maxn]; int dp[maxn][maxn]; int num[maxn]; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",mp[i]); } for(int i=n-1;i>=0;i--){ for(int j=n-1;j>=0;j--){ if(mp[i][j]=='1'){ dp[i][j] = Min(dp[i + 1][j], dp[i][j + 1], dp[i + 1][j + 1])+ 1; } for(int k=2;k<=dp[i][j];k++){ num[k]++; } } } for(int i=2;i<=n;i++){ if(num[i]){ cout<<i<<" "<<num[i]<<endl; } } }