题目大意: 给一个n*m的矩阵,表示高度,然后找条最长路滑雪,要求高度递减。
想法:这道题目很早以前做过,最近又开了一次。开始看成不需要严格递减,平着也行……然后发现好难做啊……搜索的话标记不知道怎么开,然后读了一遍题发现读错了…然后很快就过了…开一个dp数组记录从这个点开始的最长路,开一个visit数组记录是否访问过。然后调用递归函数,如果访问过直接返回dp数组,如果每访问过对于四周进行遍历,找出满足条件的+1即可,然后找出最大值。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[500][500];
int dp[500][500];
int visited[500][500];
int D(int x,int y,int r,int c)
{
int T=1;
if(visited[x][y]==1)
{
return dp[x][y];
}
if((x+1)<=r)
{
if(a[x][y]>a[x+1][y])
{
if(visited[x+1][y]==1)
T=max(T,dp[x+1][y]+1);
else
T=max(T,D(x+1,y,r,c)+1);
}
}
if((y-1)>=1)
{
if(a[x][y]>a[x][y-1])
{
if(visited[x][y-1]==1)
T=max(T,dp[x][y-1]+1);
else
T=max(T,D(x,y-1,r,c)+1);
}
}
if((y+1)<=c)
{
if(a[x][y]>a[x][y+1])
{
if(visited[x][y+1]==1)
T=max(T,dp[x][y+1]+1);
else
T=max(T,D(x,y+1,r,c)+1);
}
}
if((x-1>=1))
{
if(a[x][y]>a[x-1][y])
{
if(visited[x-1][y]==1)
T=max(T,dp[x-1][y]+1);
else
T=max(T,D(x-1,y,r,c)+1);
}
}
dp[x][y]=T;
visited[x][y]=1;
return T;
}
int main()
{
int r,c;
cin>>r>>c;
memset(dp,0,sizeof(dp));
memset(visited,0,sizeof(visited));
memset(a,0,sizeof(a));
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
{
cin>>a[i][j];
}
}
int Max=0;
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
{
int temp=D(i,j,r,c);
Max=max(Max,temp);
}
}
cout<<Max<<endl;
}