給定乙個r行c列的矩陣,表示乙個矩形網格滑雪場。
矩陣中第 i 行第 j 列的點表示滑雪場的第 i 行第 j 列區域的高度。
乙個人從滑雪場中的某個區域內出發,每次可以向上下左右任意乙個方向滑動乙個單位距離。
當然,乙個人能夠滑動到某相鄰區域的前提是該區域的高度低於自己目前所在區域的高度。
下面給出乙個矩陣作為例子:
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
在給定矩陣中,一條可行的滑行軌跡為24-17-2-1。
在給定矩陣中,最長的滑行軌跡為25-24-23-…-3-2-1,沿途共經過25個區域。
現在給定你乙個二維矩陣表示滑雪場各區域的高度,請你找出在該滑雪場中能夠完成的最長滑雪軌跡,並輸出其長度(可經過最大區域數)。
輸入格式
第一行包含兩個整數r和c。
接下來r行,每行包含c個整數,表示完整的二維矩陣。
輸出格式
輸出乙個整數,表示可完成的最長滑雪長度。
資料範圍
1≤r,c≤300,
0≤矩陣中整數≤10000
輸入樣例:
5 51 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
使用記憶化陣列 記錄每個點的最大滑動長度
遍歷每個點作為起點
然後檢測該點四周的點 如果可以滑動到其他的點
那麼該點的最大滑動長度 就是其他可以滑到的點的滑動長度+
1dp[i]
[j]=
max(dp[i]
[j-1
], dp[i]
[j+1
],dp[i-1]
[j],dp[i+1]
[j])+1
由於滑雪是必須滑到比當前低的點 所以不會存在乙個點多次進入的問題
如果該點的dp[
] 不為初始化值 那麼就說明計算過 不必再次計算。
#include
#include
#include
using
namespace std;
const
int n =
310;
int n, m;
int g[n]
[n];
int f[n]
[n];
int dx[4]
=, dy[4]
=;//dp[i][j]表示從這個點出發達到的最大距離
intdp
(int x,
int y)
}return v;
}int
main()
滑雪 記憶化搜尋
from silence 滑雪 背景 background 成成第一次模擬賽 第三道 描述 description 輸入格式 input format 輸入檔案 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2.r 1行 每行c個數,表示這個矩陣。輸出格式 output format...
記憶化搜尋 滑雪
題目描述 michael喜歡滑雪這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16...
滑雪 記憶化搜尋
trs喜歡滑雪。他來到了乙個滑雪場,這個滑雪場是乙個矩形,為了簡便,我們用r行c列的矩陣來表示每塊地形。為了得到更快的速度,滑行的路線必須向下傾斜。例如樣例中的那個矩形,可以從某個點滑向上下左右四個相鄰的點之一。例如24 17 16 1,其實25 24 23 3 2 1更長,事實上這是最長的一條。輸...