滑雪time limit:1000ms
memory limit:65536k
total submissions:93021
accepted:35199
description
michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子
1 2 3 4 516 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
乙個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。在上面的例子中,一條可滑行的滑坡為24-17-16-1。當然25-24-23-...-3-2-1更長。事實上,這是最長的一條。
input
輸入的第一行表示區域的行數r和列數c(1 <= r,c <= 100)。下面是r行,每行有c個整數,代表高度h,0<=h<=10000。
output
輸出最長區域的長度。
sample input
5 5sample output1 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
解題歷程:
這是第三次周賽的h題,當時第一反應是用bfs做,每個點查詢一遍,但覺得可能會tle,後來實踐中也證實了這一點。
題目提示為dp,於我的理解中,dp無非就是兩種方式:遞迴 or 遞推
遞迴演算法:
#include #include #include #include #define n 101
using namespace std;
int map[n][n],len[n][n];
int dir[4][2]=,,,};
int r,c;
int dp(int i,int j)
部分 }
}len[i][j]=maxx+1;
return maxx+1;}
int main()
printf("%d\n",mx);
}return 0;
}
遞推演算法:
以前做過的最長合法序列(hoj 10179):
有k個整數a[1],a[2]...a[k],你需要從前往後選出若干個數,使得每乙個後面的數都要大於或等於前面的數.例如,對於系列1,4,2,5,2,3,選出1,2,2,3是合法的,但是選出4,2,3是不合法的.
這也是一道經典的遞推dp,但區別在於:
最長合法序列 它的 狀態轉移方程:
dp(i,a[i])=max+1;它寫成遞推的形式是一維的:
而這道題,其狀態轉移方程:
dp(i,j,h[i][j])=如果直接按照圖的結構遞推,那麼就將是二維的形式,這樣的話我並不會寫遞推。所以,將所有點按照h降序排列,這樣就轉化為一維的遞推式。max + 1;
**如下:
#include#include#includeusing namespace std;
int r,c,dir[4][2]=,step[101][101],h[101][101];
struct dotmap[10001];
bool judge(int rr,int cc)
int main()
} } for(int i=0;i
POJ 1088 DP 記憶化搜尋
題意 給出山的高度圖,求出最長的一條下降路線。思路 很容易就想到了用dp,但是很難寫出遞推的順序。當然,我們可以記錄座標,按照高度進行排序,再dp,但是這樣的代價是不是有點大呢。所以,我們要用記憶化搜尋來完成這件事情。其實在狀態轉移的過程中,就隱含了dp的順序。如下 include include ...
poj1088 dp 記憶化搜尋 (入門好題)
題目意思很簡單,一開始我直接dfs深搜,超時果果的,看了題解以後,學習了記憶化搜尋,就是記錄下已經求出的當前結點的最大值,在之後訪問到這個節點時,就能直接呼叫結果,減少重複計算。是一道好題。以下為 include include include include using namespace std...
POJ 1088 滑雪 記憶遞迴型dp
time limit 1000ms memory limit 65536k description michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。...