题目链接
题意
给出一个m x n的地图,要求寻找地图上严格下降的最长路径
解决
入门动态规划
- 我们使用dp[i][j]保存“从当前节点出发,能走的最长路径的长度”
- 对每一个点进行一次dfs,dfs的同时保存dp[i][j]
- 注意记忆化搜索,一个节点计算过,就不必再次计算了,使用vis[i][j]保存当前节点是否访问过
#include<bits/stdc++.h>
using namespace std;
int m,n;
int maps[105][105];
int dp[105][105];
bool vis[105][105];
int dfs(int i,int j)
{
if(vis[i][j]) return dp[i][j];
vis[i][j]=1;
int ni,nj,ans = 1;
for(int di=-1;di<=1;di++)
{
for(int dj=-1;dj<=1;dj++)
{
if(di*dj || (!di && !dj)) continue;
ni=i+di;
nj=j+dj;
if(ni<0||nj<0||ni>=m||nj>=n) continue;
if(maps[ni][nj]>=maps[i][j]) continue;
ans = max(ans,dfs(ni,nj)+1);
}
}
return dp[i][j]=ans;
}
int main()
{
int cases;
string name;
scanf("%d",&cases);
while(cases--)
{
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
cin>>name;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&maps[i][j]);
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
ans = max(ans,dfs(i,j));
/*for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
{
printf("%d ",dp[i][j]);
}
cout<<endl;
}*/
cout<<name<<": ";
printf("%d\n",ans);
}
}