题意:给一个n*m矩阵,每个元素对应一个高度h,要求只能从一个位置走到相邻位置(不能越界)且只能从高度大的走到小的,求符合的最大路径长度
分析:相当于一个DAG,在上面进行记忆化搜索,dp[ i ][ j ] =max{ dp[ p ][ q ] }+1
#include<cstdio>
#include<cstring>
int a[1010][1010],dp[1010][1010];
int n,m;
int DP(int i,int j)
{
if(dp[i][j]>1)
return dp[i][j];
int max=1,high;
if(a[i][j]>a[i][j-1]&&j-1>=1)
{
high=DP(i,j-1)+1;
if(high>max)
max=high;
}
if(a[i][j]>a[i-1][j]&&i-1>=1)
{
high=DP(i-1,j)+1;
if(high>max)
max=high;
}
if(a[i][j]>a[i][j+1]&&j+1<=m)
{
high=DP(i,j+1)+1;
if(high>max)
max=high;
}
if(a[i][j]>a[i+1][j]&&i+1<=n)
{
high=DP(i+1,j)+1;
if(high>max)
max=high;
}
return max;
}
int main()
{
int i,j;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
dp[i][j]=1;
}
int ans=0,tmp;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
dp[i][j]=DP(i,j);
if(ans<dp[i][j])
ans=dp[i][j];
}
}
printf("%d\n",ans);
}
return 0;
}