poj 1088 经典的记忆化搜索

来源:互联网 发布:centos png 编辑:程序博客网 时间:2024/05/29 19:00
这是一题非常经典的记忆化搜索题。

在这题的讨论里 ,有以为大牛说: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;}


0 0
原创粉丝点击