滑雪 dp 記憶化搜索

給定一個R行C列的矩陣,表示一個矩形網格滑雪場。css

矩陣中第 i 行第 j 列的點表示滑雪場的第 i 行第 j 列區域的高度。c++

一我的從滑雪場中的某個區域內出發,每次能夠向上下左右任意一個方向滑動一個單位距離。ide

固然,一我的可以滑動到某相鄰區域的前提是該區域的高度低於本身目前所在區域的高度。spa

下面給出一個矩陣做爲例子:code

1 2 3 4 5ci

16 17 18 19 6it

15 24 25 20 7class

14 23 22 21 8數據

13 12 11 10 9di

在給定矩陣中,一條可行的滑行軌跡爲24-17-2-1。

在給定矩陣中,最長的滑行軌跡爲25-24-23-…-3-2-1,沿途共通過25個區域。

如今給定你一個二維矩陣表示滑雪場各區域的高度,請你找出在該滑雪場中可以完成的最長滑雪軌跡,並輸出其長度(可通過最大區域數)。
輸入格式

第一行包含兩個整數R和C。

接下來R行,每行包含C個整數,表示完整的二維矩陣。
輸出格式

輸出一個整數,表示可完成的最長滑雪長度。
數據範圍

1≤R,C≤300
,
0≤矩陣中整數≤10000

輸入樣例:

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

輸出樣例:

25

#include<bits/stdc++.h>
using namespace std;
const   int N=330;
int a[N][N];
int f[N][N];
    int n,m; int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; void dfs(int x,int y)
{
    f[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(tx<0||ty<0||tx>=n||ty>=m||a[tx][ty]>=a[x][y])    continue;
        if(f[tx][ty]==-1)  dfs(tx,ty);
      f[x][y]=max(f[x][y],f[tx][ty]+1);
    }
}
int main()
{
    int ans=0;
    memset(f,-1,sizeof f);
    cin>>n>>m;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    cin>>a[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++) if(f[i][j]==-1)
    {
        dfs(i,j);
        ans=max(ans,f[i][j]);
    }
    cout<<ans<<endl;
    return 0;
}
相關文章
相關標籤/搜索