洛谷 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; }

浙公网安备 33010602011771号