USACO range
直接用dp统计即可, 假设dp[i][j]是i, j为右下角的最大可用矩阵,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) +1, 最后统计下答案即可。代码如下:
/* ID: m1500293 LANG: C++ PROG: range */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int Map[300][300], dp[300][300]; int N; int ans[300]; int main() { freopen("range.in", "r", stdin); freopen("range.out", "w", stdout); scanf("%d", &N); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) scanf("%1d", &Map[i][j]); memset(dp, 0, sizeof(dp)); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) if(Map[i][j]==1) dp[i][j] = min(dp[i-1][j], min(dp[i][j-1], dp[i-1][j-1]))+1; memset(ans, 0, sizeof(ans)); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) for(int k=2; k<=dp[i][j]; k++) ans[k]++; for(int k=2; k<=N; k++) if(ans[k]) printf("%d %d\n", k, ans[k]); return 0; }