nylgoj10

这个属于动态规划的问题,其实就是把以前所经历过的节点给保存起来,等到下次计算的时候不再进行分值的遍历了,而是直接的进行使用。

#include<stdio.h>

#include<string.h>

#define MAX 101

int height[MAX][MAX];

int tem[MAX][MAX];

int r,c;

int dir[4][2]={-1,0,1,0,0,1,0,-1};

int main()

{

   int dfs(int x,int y);

   int t;

   int i,j,res;

   scanf("%d",&t);

   while(t--)

   {

         res=0;

         scanf("%d%d",&r,&c);

         for(i=1;i<=r;i++)

             for(j=1;j<=c;j++)

             {

                scanf("%d",&height[i][j]);

                tem[i][j]=0;

             }

  

           for(i=1;i<=c;i++)

              for(j=1;j<=c;j++)

              {

                 tem[i][j]=dfs(i,j);

                 if(tem[i][j]>res)

                    res=tem[i][j];

              }

    printf("%d\n",res+1);

   }

  return 0;

}

bool isvalueable(int x,int y)

{

      if(x>0&&x<=r && y>0 && y<=c)

         return true;

      return false;

}

int dfs(int x,int y)

{

      if(tem[x][y]>0) return tem[x][y];

      //核心代码

      int max=0,i;//max定义的位置很重要

      for(i=0;i<4;i++)

      {

          int tx=x+dir[i][0];

          int ty=y+dir[i][1];

          if(isvalueable(tx,ty))

          {

              if(height[x][y]>height[tx][ty])

              {

                  int m=dfs(tx,ty)+1;//m

                  if(max<m) max=m;

              }

          }

      }

      return max;

}

posted @ 2012-05-06 16:01  coodle  阅读(140)  评论(0)    收藏  举报