1. 程式人生 > >hiho一下 第222周 Big Plus

hiho一下 第222周 Big Plus

題面 :

Link

題意:

很簡單,直接看圖。

思路:

開始以為一個dfs暴力莽過,看討論利用字首和思想,先預處理每一點向四個方向有最多多少個連續點,取最小值即答案。時間複雜性O(n^2)。具體見程式碼!

程式碼

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500+50;
int n,mat[maxn][maxn];
int Up[maxn][maxn],Down[maxn][maxn],Left[maxn][maxn],Right[maxn][maxn];

int main(){
    while(~scanf
("%d",&n)){ memset(Up,0,sizeof(Up)); memset(Down,0,sizeof(Down)); memset(Left,0,sizeof(Left)); memset(Right,0,sizeof(Right)); for(int i=1;i<=n;i++){ char s[n+1]; scanf("%s",s+1); for(int j=1;j<=n;j++){ mat[i][j] = s[j] - '0'; }
} for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mat[i][j]==1){ Left[i][j] = Left[i][j-1] + 1; Up[i][j] = Up[i-1][j] + 1; } if(mat[i][n-j+1]==1){ Right[i][n-j+1] = Right[i][n-j+2] + 1; } if(mat[
n-i+1][j] == 1){ Down[n-i+1][j] = Down[n-i+2][j] + 1; } } } int ans = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mat[i][j]==1){ ans = max(ans,min(min(Up[i][j],Down[i][j]), min(Left[i][j],Right[i][j]))-1); } } } printf("%d\n",ans); } }