遞迴 動態規劃 POJ Help Jimmy

2021-10-04 13:34:05 字數 2700 閱讀 8058

1

3 8 17 20

0 10 8

0 10 13

4 14 3

首先明確遞迴函式的功能

由於向左走和向右走是性質一樣的兩個子問題,因此此時遞迴函式的就是針對當前平板的向左/右走,計算時間

遞迴結束條件

當遞迴到第n個平板時,遞迴結束,返回當前高度(當前高度小於限定的最高高度)

確定遞迴的等價關係

找到距離當前平板最近的下乙個平板,計算下乙個平板的最短時間(當前平板與下乙個平板的高度差小於限定的最高高度)

/**********

poj:help jimmy

遞迴解法

***********/

#include

#include

#include

using

namespace std;

#define max_n 1000

#define infinite 1000000

int t, n, x, y, max_h;

class

platform};

int left_min_time[max_n+10]

;int right_min_time[max_n+10]

;platform platforms[max_n+10]

;int

mintime

(int n_p,

bool bleft)

else

// 找到下乙個平台

int i;

for(i=n_p+

1; i<=n; i++)}

// 中止遞迴

if(i<=n)

}else

else

}// 遞迴的等價關係

int n_left_time = h - platforms[i]

.h + x - platforms[i]

.x_l;

int n_right_time = h - platforms[i]

.h + platforms[i]

.x_r - x;

if(left_min_time[i]==-

1)if(right_min_time[i]==-

1)n_left_time +

= left_min_time[i]

; n_right_time +

= right_min_time[i];if

(n_right_time < n_left_time)

return n_right_time;

return n_left_time;

}int

main()

sort

(platforms, platforms+n+1)

;

cout <<

mintime(0

,true

)<< endl;

}return0;

}

明確儲存歷史記錄的陣列含義

陣列儲存的是每乙個板子向左/右的到達地面的最短時間(距離);

確定遞推關係

當前板子到達地面的最短時間為其距離最近的下面一塊板子向左和向右最短時間的最小值加上兩塊板子的距離(兩塊板子的距離沒有超過max時);

明確初始值

通過高度進行排序,得到高度最低的板子,其高度就是初始值(當高度低於max時)。

/**********

poj:help jimmy

遞推解法

***********/

#include

#include

#include

using

namespace std;

#define max_n 1000

#define infinite 1000000

int t, n, x, y, max_h;

class

platform};

int left_min_time[max_n+10]

;int right_min_time[max_n+10]

;platform platforms[max_n+10]

;int

main()

sort

(platforms, platforms+n+1)

;// 遞推開始

for(

int i=n; i>=

0; i--)}

// 初始值

if(j>n)

else

}// 遞推關係

else

else

}// 尋找右下的第乙個板子

for(j=i+

1;j<=n;j++)}

// 初始值

if(j>n)

else

}// 遞推關係

else

else}}

cout <<

min(left_min_time[0]

, right_min_time[0]

)<< endl;

}return0;

}

動態規劃 遞迴

動態規劃是求解包含重疊子問題的最優化方法 1.基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解 注意 不是簡單分而治之 2.只能應用於有最優子結構的問題 即區域性最優解能決定全域性最優解,或問題能分解成子問題來求解 3.具有無後效性。它要求每乙個問題的決策,不能夠對解...

動態規劃與遞迴

這裡借用leetcode的一道例題,來說一下動態規劃和遞迴的區別 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 1 的兩個結點。例如,給定三角形 2 3,4 6,5,7 4,1,8,3...

遞迴和動態規劃

暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個 子問題的解 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來,避免重複計算 3,把暴力遞迴的過程,抽象成了狀態表達...