题目地址:点击打开链接
最长的滑雪路径
///记忆化搜索, dp[i][j] 表示从(i,j)出发能走的最长路
/// dp[i][j] =max{dp[x][y]}+1, 其中(x,y)是(i,j)附近的四个格子之一并且 a[x][y]<a[i][j]
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stdio.h>
#define cle(n) memset(n,0,sizeof(n))
using namespace std;
typedef long long ll;
const int maxn =110;
const int maxm=500100000;
int dp[maxn][maxn],a[maxn][maxn]; ///dp[i][j] 表示从第i行j列这个点开始走,得出的最长距离
int n,m,T;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
char s[50];
int dfs(int x,int y)
{
if(dp[x][y]!=-1)return dp[x][y];
dp[x][y]=0;
for(int i=0;i<4;i++){
int nx=dx[i]+x;
int ny=dy[i]+y;
if(a[nx][ny]<a[x][y])
dp[x][y]=max(dp[x][y],dfs(nx,ny));
}
return ++dp[x][y];
}
void input()
{
scanf("%s%d%d",s,&n,&m);
memset(dp,-1,sizeof(dp)); cle(a);
for(int i=1;i<=n;i++)
{
a[i][0]=a[i][n+1]=maxm;
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
a[0][j]=a[n+1][j]=maxm;
}
}
}
int work()
{
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
ans=max(ans,dfs(i,j));
}
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
input();
printf("%s: %d\n",s,work());
}
return 0;
}