uva 10285 Longest Run on a Snowboard

6027 단어 long
기초 DP 복습, 기억화 검색
제목: 이름과 n*m 행렬을 주십시오. 다음은 행렬 정보입니다. 매번 한 칸에서 상하좌우로 이동할 수 있지만 그 숫자는 현재 있는 칸보다 작아야 합니다.임의의 점에서 출발해서 가장 긴 거리가 얼마냐고 물어볼 수 있다
dp[i][j]는 (i,j)에서 출발할 수 있는 가장 긴 길을 나타낸다
dp[i][j]=max{dp[x][y]}+1, 그중 (x, y)는 (i, j) 부근의 네 칸 중 하나이고 a[x][y] 
#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
",name,res); } return 0; }

좋은 웹페이지 즐겨찾기