poj1088
以前一直想搞acm,但一直沒怎麼動,沒技術苦逼研究僧還是找不到工作,所以決心搞acm,小夥伴們和我一起來學習吧。
動態規劃第一題 北大acm 1088滑雪問題
問題描述:
滑雪
time limit:1000ms
memory limit:65536k
total submissions:78013
accepted:28994
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。當然25-24-23-...-3-2-1更長。事實上,這是最長的一條。
input
輸入的第一行表示區域的行數r和列數c(1 <= r,c <= 100)。下面是r行,每行有c個整數,代表高度h,0<=h<=10000。
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
25動態規劃解題描述:
首先對所有元素排序,設為a1,a2,a3 ,a4,a5,a6….
然後按照公升序順序逐次求每個元素ax的最大長度,針對每個元素對上下左右四個方向的元素與元素ax的高度比較,如果比ax大,放棄,如果比ax小,則ax經過此元素形成長度加一的最長路徑。
**:#include
#include
using
namespace std;/*
*記錄高度值(用於排序) *
記錄位置row col用於尋找周圍元素*/
struct
element ;
/* *記錄高度值和經過此點的最大長度 */
struct
arrnode ;
/* *快排比較函式 */
int compare( const
void * ele1,const
void * ele2)/*
*分別從上下左右四個方向檢視與row行col列元素x相鄰的四個元素
*在四個元素中找高度值小於x並且長度最大的長度賦值給x的長度*/
int around_max_length(int
row, int
col, arrnode * arr,int
arrrow, int
arrcol)
if( (row - 1) >= 0 )
if( (row + 1) < arrrow )
if( (col + 1) < arrcol )
return max;
}int main()
;arr_high[listnum]= arn;
element elet = ;
listele[listnum++]= elet;}}
//快排
qsort(listele,r*c,sizeof(element),compare );
//對有序陣列listele的每個元素依次計算其最大長度記錄於arr_high用於以後計算的子問題的解
for(int k = 0; k < r*c;k++ )
//遍歷陣列arr_high尋找最大長度
int max = 0;
for(int m = 0; m < r*c;m++ )
cout<
int kk;
cin>>kk;
return 0;
}
1088 滑雪(動態規劃)
總時間限制 1000ms 記憶體限制 65536kb 描述michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表...
acm 動態規劃
學習參考 就是倒推 尋找遞推式 難點 然後用陣列將資料計算出來 最後直接呼叫得到答案 01揹包問題 for i 0 i 例題一 洛谷oj 開心的金明 include include using namespace std const int max 100001 long long dp max i...
POJ1088 動態規劃
題目鏈結 這個題目和最長子序列什麼的極為相似。不過之前都是一維,現在變成二維的了。僅此而已。因此我們可以想辦法把它先變成一維的。struct nodea 100 100 5 然後我們可以根據height排序,從最高點開始考慮,有點貪心的意思。和單源最短路徑dijkstra相似。int ma 100 ...