这道题有点坑,这是一道dp题,关键要找到子问题,这里的子问题可以分为两个,从某一点向左走的最长非0的长度,和向上走的最长非0的长度,找到这两个之后,再做判断,其实还可以更方便点,分为四个子问题,每一点的最大加号为四个方向最小的那个值
class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
int left[N][N];
int up[N][N];
memset(left,0,sizeof(left));
memset(up,0,sizeof(up));
int m[N][N];
for(int i=0;i<N;i++)
{
for(int q=0;q<N;q++)
{
m[i][q]=1;
}
}
for(int i=0;i<mines.size();i++)
{
m[mines[i][0]][mines[i][1]]=0;
}
for(int i=0;i<N;i++)
{
for(int q=0;q<N;q++)
{
left[i][q]=m[i][q];
up[i][q]=m[i][q];
}
}
for(int i=0;i<N;i++)
{
for(int q=0;q<N;q++)
{
if(m[i][q])
{
if(q>0)
left[i][q]=left[i][q-1]+1;
if(i>0)
up[i][q]=up[i-1][q]+1;
}
}
}
int result=0;
for(int i=0;i<N;i++)
{
for(int q=0;q<N;q++)
{
int t=min(left[i][q],up[i][q]);
for(;t>0;t--)
{
if(t+i-1>=N || t+q-1>=N || t<=0)
continue;
if(left[i][q+t-1]>=2*t-1 && up[i+t-1][q]>=2*t-1)
result=max(result,t);
}
}
}
return result;
}
};