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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章