计蒜客--正方形个数

题目链接: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])

代码如下:

#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;
        }
    }
}
View Code

 

posted @ 2018-10-29 20:38  buerdepepeqi  阅读(222)  评论(0)    收藏  举报