UVA 10285 Longest Run on a Snowboard(记忆化搜索|动态规划入门)

题目链接

题意

给出一个m x n的地图,要求寻找地图上严格下降的最长路径

解决

入门动态规划

  1. 我们使用dp[i][j]保存“从当前节点出发,能走的最长路径的长度”
  2. 对每一个点进行一次dfs,dfs的同时保存dp[i][j]
  3. 注意记忆化搜索,一个节点计算过,就不必再次计算了,使用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);
    }
}
发布了54 篇原创文章 · 获赞 8 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章