这是一题非常经典的记忆化搜索题。
在这题的讨论里 ,有以为大牛说:A的题不在多 , 在于精 !!!
记忆化搜索:就是说 , 把每个搜索过的点的状态都记忆下来 , 等下次 , 如果再次搜索到这个点时 , 那么就可以不去搜索 ,直接调用这个被记忆的状态 。
代码:
在这题的讨论里 ,有以为大牛说:A的题不在多 , 在于精 !!!
记忆化搜索:就是说 , 把每个搜索过的点的状态都记忆下来 , 等下次 , 如果再次搜索到这个点时 , 那么就可以不去搜索 ,直接调用这个被记忆的状态 。
代码:
const int maxn = 200;
int grap[maxn][maxn];
int maxy[maxn][maxn] ;
int r , c;
int d_x[4] = {1 , 0 , -1, 0};
int d_y[4] = {0 , -1 , 0 , 1};
int dfs(int u , int v)
{
if(maxy[u][v]) returnmaxy[u][v]; // 如果被搜过
int g ,h;
for(int i =3; i >= 0; i--)
{
g = u +d_x[i] , h = v + d_y[i];
if(g >= 0&& g < r && h >= 0 && h < c&& grap[u][v] > grap[g][h])
{
int sum =dfs(g , h) + 1;
if(sum >maxy[u][v]) maxy[u][v] = sum;
}
}
returnmaxy[u][v];
}
int main()
{
while(scanf("%d %d" , &r , &c) != EOF)
{
memset(maxy, 0 , sizeof(maxy));
int i ,j;
for(i = 0 ;i < r; i++)
for(j = 0 ;j < c; j++)
scanf("%d" ,&grap[i][j]);
int maxx =0;
for(i = r-1;i >= 0; i--)
for(j = c-1;j >= 0; j--)
{
if(!maxy[i][j]) // 如果这个点没被搜过
{
dfs(i ,j);
maxx =maxx>maxy[i][j]?maxx:maxy[i][j];
//cout<<maxx<<endl;
}
else if(maxx< maxy[i][j]) maxx =maxy[i][j]; // 如果这个点已经搜过 , 就直接调用 ,其被"记忆"的状态
}
cout<<maxx+1<<endl;
}
return0;
}