uva 10285 Longest Run on a Snowboard

复习一下基础DP,记忆化搜索

题意:给一个名字,和n*m矩阵,下面是矩阵信息,每次在一个格子,可以向上下左右移动,但是要求那个数字比当前所在格子数字小。可以从任意点出发,问最长的距离是多少

dp[i][j]表示从(i,j)出发能走的最长路

dp[i][j] = max{ dp[x][y] } + 1 , 其中(x,y)是(i,j)附近的四个格子之一并且a[x][y] < a[i][j]

 

#include <cstdio>

#include <cstring>

#define N 110

#define MAX 110

#define max(a,b) ((a)>(b)?(a):(b))



const int x[4]={-1,1,0,0}; //上下左右

const int y[4]={0,0,-1,1}; //上下左右

int a[N][N];

int dp[N][N];

int n,m;



int dfs(int i, int j)

{

   if(dp[i][j] != -1)

      return dp[i][j];



   dp[i][j] = 0;

   for(int k=0; k<4; k++) //4个方向

   {

      int xx = i + x[k];

      int yy = j + y[k];

      if(a[xx][yy] < a[i][j])

         dp[i][j] = max(dp[i][j] , dfs(xx,yy));

   }

   return ++dp[i][j];

}



int main()

{

   int cas;

   scanf("%d",&cas);

   while(cas--)

   {

      char name[50];

      scanf("%s%d%d",name,&n,&m);

      for(int i=1; i<=n; i++)

         for(int j=1; j<=m; j++)

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

      for(int i=0; i<=m+1; i++)

         a[0][i] = a[n+1][i] = MAX;

      for(int i=0; i<=n+1; i++)

         a[i][0] = a[i][m+1] = MAX;



      memset(dp,-1,sizeof(dp));

      int res = -1;

      for(int i=1; i<=n; i++)

         for(int j=1; j<=m; j++)

            res = max(res , dfs(i,j));



      printf("%s: %d\n",name,res);

   }

   return 0;

}

 

你可能感兴趣的:(long)