经典的滑雪问题,采用记忆化dp。
代码如下:
<span style="font-size:18px;">#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int m[110][110],d[110][110],r,c;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int dp(int i,int j)
{
if(d[i][j]>0)
return d[i][j];
d[i][j]=1;
for(int k=0;k<4;k++)
{
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<1||xx>r||yy<1||yy>c)
continue;
int t=0;
if(m[i][j]<m[xx][yy])
t=dp(xx,yy)+1;
if(d[i][j]<t)
d[i][j]=t;
}
return d[i][j];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char name[100];
scanf("%s%d%d",name,&r,&c);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
scanf("%d",&m[i][j]);
int ans=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
memset(d,0,sizeof(d));
ans=max(dp(i,j),ans);
}
printf("%s: %d\n",name,ans);
}
return 0;
}
</span>