滑雪(dp 深搜)

2021-06-19 08:09:32 字數 1243 閱讀 1772

time limit:1 ms| 

memory limit:128 mb

difficulty:3

trs喜歡滑雪。他來到了乙個滑雪場,這個滑雪場是乙個矩形,為了簡便,我們用r行c列的矩陣來表示每塊地形。為了得到更快的速度,滑行的路線必須向下傾斜。

例如樣例中的那個矩形,可以從某個點滑向上下左右四個相鄰的點之一。例如24-17-16-1,其實25-24-23…3-2-1更長,事實上這是最長的一條。

第1行: 兩個數字r,c(1<=r,c<=100),表示矩陣的行列。

第2..r+1行:每行c個數,表示這個矩陣。

僅一行: 輸出1個整數,表示可以滑行的最大長度。

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

思路:記憶化搜尋(今天剛知道原來這叫記憶化搜尋), 就是深搜, 但是要將搜尋過的

結果儲存起來下次深蒐時可直接呼叫(優化後的遞迴求斐波納鍥數列),用兩個二維數

len[x][y], hight[x][y]分別表示x,y可以滑的最遠步數和每個點的高度, 用遞迴實現動歸的

從小到大求值。

#include #include #include #define max 100

int n, m, len[max][max], hight[max][max], dir[4][2] = , , , };

int dfs(int x, int y)

int max = 0, t, tx, ty; //每次搜尋之前將到(x,y)的最長路徑長度max賦為0

for(int i = 0; i < 4; i++) //搜四個方向找出最長路徑}}

len[x][y] = max + 1; //此點最長路徑為max+1

return max + 1; //返回此點最長路徑,供上級呼叫}

int main()

}maxx = 0;

for(i = 0; i < n; i++) //遍歷所有點求最長路徑}}

printf("%d\n", maxx); //列印最長路徑

} return 0;

}

深搜 DP POJ 1088 滑雪

michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

POJ 1088 滑雪 (深搜 DP)

題目描述 input 第一行輸入兩個數n,m代表滑梯範圍行n和列m 1 n,m 100 下面是n行,每行有m個整數,代表高度h,0 h 20000 output 輸出乙個值,代表glory能夠在滑滑梯上面滑行的最長長度是多少 sample input 3 39 1 2 5 6 7 8 4 3 sam...

數字組合(dp 深搜

給定n個正整數a1,a2,an,從中選出若干個數,使它們的和為m,求有多少種選擇方案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數,表示a1,a2,an。輸出格式 包含乙個整數,表示可選方案數。資料範圍 1 n 100,1 m 10000,1 ai 1000 輸入樣例 4 41 1 2 2...