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;
}

 

posted @ 2013-04-22 19:40  Titanium  阅读(566)  评论(0编辑  收藏  举报