洛谷 P2733 家的范围 Home on the Range

题意

给出一个边长为n的正方形矩阵,农民约翰需要统计那些可以放牧奶牛的正方形牧场(至少是2x2的,在这些较大的正方形中没有一个点是被破坏的,也就是说,所有的点都是“1”)。 你的工作要在被供应的数据组里面统计所有不同的正方形放牧区域(>=2x2)的个数。当然,放牧区域可能是重叠。

做法

这道题用动态规划可以轻松过,数组f [ i ] [ j ]表示在矩阵中以第 i 行第 j 列的点为正方形的右下角的点所能构成的最大边长,如果这个点是 0 ,这个值就是 0;如果是 1,那么他就是f [ i - 1 ] [ j - 1 ] , f [ i - 1 ] [ j ] , f [ i ] [ j - 1 ] 中最小的那个 + 1。最后用一个数组存答案即可。

代码

复制代码
#include <bits/stdc++.h>
using namespace std;
int n,f[255][255];
char a[255][255];
int s[255]; 
int main()
{
    scanf("%d",&n);
    char t;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
            cin>>a[i][j];
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
            if(a[i][j]=='0') continue;
            f[i][j] = min(min(f[i-1][j-1], f[i-1][j]), f[i][j-1]) + 1;
        }
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            for(int k=1;k<=f[i][j];++k)
               s[k]++;
    for(int i=2;i<=n;++i)
    {
        if(s[i])
           printf("%d %d\n",i,s[i]); 
    }
    return 0;
}
复制代码

 

posted @   LikC1606  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示