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