題目鏈接
題意
給出一個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);
}
}