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...