michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子:
123乙個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。451617
1819615
2425207
1423
2221813
1211
109
在上面的例子中,一條可行的滑坡為24-17-16-1(從24開始,在1結束)。
當然25-24-23―┅―3―2―1更長。事實上,這是最長的一條。
輸入格式:
輸入的第一行為表示區域的二維陣列的行數r和列數c(1≤r,c≤100)。
下面是r行,每行有c個數,代表高度(兩個數字之間用1個空格間隔)。
輸出格式:
輸出區域中最長滑坡的長度
輸入樣例
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記憶化搜尋
記憶化搜尋本質上是搜尋的一種
但它保證了,每一層回溯得到的結果都具有子最優性質
所以又具有了動態規劃的特徵
(i,j) 為當前所在的座標
#include#includeview code#include
#include
#define re register int
using
namespace
std;
const
int max_size=110
; int
n,m;
int dir[4][2]=,,,};
inth[max_size][max_size],dp[max_size][max_size];
int inmap(int x,int
y) int max2(int a,int b,int c,int
d) int dfs(int i,int
j) nx=i+dir[1][0]; ny=j+dir[1][1
];
if(inmap(nx,ny))
nx=i+dir[2][0]; ny=j+dir[2][1
];
if(inmap(nx,ny))
nx=i+dir[3][0]; ny=j+dir[3][1
];
if(inmap(nx,ny))
dp[i][j]=max2(up,down,left,right)+1
;
return
dp[i][j];
} int
main()
} int ans=-1
;
for(re i=0;i)
} printf(
"%d\n
",ans);
}
題解 滑雪 luogu1434 記憶化搜尋
michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 123 451617 18196...
題解 P1434 滑雪
題目鏈結 此題運用功能強大的 暴力搜尋 記憶化搜尋才是重點!然而,這是一道經典的dp問題 如果我們用 dis i j 來表示座標為 i,j 時的高度 cnt i j 是我們的記憶化陣列 在合法的前提下,就有狀態轉移方程 dis i j max dis i 1 j dis i j 1 dis i 1 ...
洛谷1434滑雪題解
michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...