description
michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子
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
−16−1
24-17-16-1
24−17−
16−1
。當然25−24
−23−.
..−3
−2−1
25-24-23-...-3-2-1
25−24−
23−.
..−3
−2−1
更長。事實上,這是最長的一條。
input
輸入的第一行表示區域的行數r
rr和列數c(1
<=r
,c
<
=100
)c(1 <= r,c <= 100)
c(1<=r
,c<=1
00)。下面是r行,每行有c個整數,代表高度h
hh,0
<=h
<
=10000
0<=h<=10000
0<=h
<=1
0000
。output
輸出最長區域的長度。
sample input
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
sample output
source
shtsc 2002
解題思路
記憶化搜尋 or dp
記憶化搜尋
#include
#include
#include
using namespace std;
const int w[4]
[2]=
,,,}
;int f[
200]
[200
],n,m,a[
200]
[200
],gun;
bool check
(int x,int y)
//邊界
int demo
(int x,int y)
if(f[x]
[y]==0)
//如果四個方向都不行,賦1
f[x]
[y]=1;
return f[x]
[y];
}int main()
printf
("%d"
,gun)
;}
dp
#include
#include
#include
using namespace std;
struct dt
a[100100];
const int w[4]
[2]=
,,,}
;int f[
200]
[200
],v[
200]
[200
],n,m,num,gun;
bool cmp
(const
dt&k,
const
dt&l)
bool check
(int x,int y)
int main()
sort
(a+1
,a+1
+num,cmp)
;//排個序
for(int i=
1;i<=num;i++
) gun=
max(gun,f[x]
[y]);}
printf
("%d"
,gun+1)
;}
DP 滑雪 記憶化搜尋)
時間限制 1000 ms 記憶體限制 65536 kb 提交數 312 通過數 139 小明喜歡滑雪,因為滑雪的確很刺激,可是為了獲得速度,滑的區域必須向下傾斜,當小明滑到坡底,不得不再次走上坡或等著 來載他,小明想知道在乙個區域中最長的滑坡。滑坡的長度由滑過點的個數來計算,區域由乙個二維陣列給出,...
滑雪 dp 記憶化搜尋
給定乙個r行c列的矩陣,表示乙個矩形網格滑雪場。矩陣中第 i 行第 j 列的點表示滑雪場的第 i 行第 j 列區域的高度。乙個人從滑雪場中的某個區域內出發,每次可以向上下左右任意乙個方向滑動乙個單位距離。當然,乙個人能夠滑動到某相鄰區域的前提是該區域的高度低於自己目前所在區域的高度。下面給出乙個矩陣...
DP 記憶化搜尋 滑雪
給定乙個r行c列的矩陣,表示乙個矩形網格滑雪場。矩陣中第 i 行第 j 列的點表示滑雪場的第 i 行第 j 列區域的高度。乙個人從滑雪場中的某個區域內出發,每次可以向上下左右任意乙個方向滑動乙個單位距離。當然,乙個人能夠滑動到某相鄰區域的前提是該區域的高度低於自己目前所在區域的高度。下面給出乙個矩陣...