题目大概:

有一个矩形滑雪场,只能从高处滑到低的地方,可以向四个方向滑,问这个滑雪场最长的一条滑雪道是多长。

思路:

dp题。

a[i][j]为矩阵各个地方的高度。

dp[i][j]为滑到改点处的最长距离。

滑到一个点可以从它的四个方向滑过去,dp[i][j]=max(dp[i-1][j]+1,dp[i][j-1]+1,dp[i+1][j-1]+1,dp[i-1][j+1]+1)。

中间用记忆式搜索可以减少循环次数。

感想:

无。

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
int a[101][101];
int dp[101][101];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int solve(int x, int y)
{
if (dp[x][y]>0)
return dp[x][y];
for (int i=0;i<4;i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if (0<=nx&&nx<n&&0<=ny&&ny<m&&a[nx][ny]<a[x][y]){
dp[x][y]=max(dp[x][y],solve(nx,ny)+1);
}
}
return dp[x][y];
}
int main()
{

cin>>n>>m;
memset(dp,0,sizeof(dp));
for (int i=0;i<n;i++){
for(int j=0;j<m;j++)
cin>>a[i][j];
}
int ans=0;
for (int i=0;i<n;i++) {
for (int j=0; j<m;j++)
ans=max(ans,solve(i,j));
}
cout<<ans+1;

return 0;
}