動態規劃之小朋友過河問題

2021-09-22 10:24:27 字數 1104 閱讀 1864

小朋友過橋問題:在乙個夜黑風高的晚上,有n(n <= 50)個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t[i],兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。

思路分析:假設過河有四個小朋友,其過河時間分別為1,2,3,4。我們先從小規模開始分析其最優的策略。

第一種,肯定是讓1,2一起過去,然後1回來,把3接走,再讓1回來,把4接走。

第二種情況,同樣先是讓1,2過去,然後1回來,但是接下來,可以讓3,4一起走,然後2回來,把1接走。

這兩種情況的區別就是,倒數的後兩個人是一起走,還是其中乙個先跟1走

所以,我們求出兩種情況後,應該比較哪種是最小值,取最小。

ok,**的基本思路現在已經理清了,那麼具體又是如何實現的呢。很明顯,這是乙個典型的動態規劃問題,即它有著典型的重複子問題,並且可以在最優化,我們可以嘗試著,推導出它的遞推公式:

首先我們可以輕易的求出它的基準情況,即當只有1、2、3個人時.

dp[1]=a[1]

dp[2]=a[2]

dp[3]=dp[1]+dp[2]+dp[3]

dp[4]=min(dp[4-2]+a[1]+a[4-1]+2*[2],dp[4-1]+a[1]+a[4])

依次類推。

動態規劃類的問題重要的是找到遞推公式,然後找到基準情況,也就是只考慮當前的情況,不考慮之前的,因為之前的情況經過遞推已經是最優的了。

ac**如下:

#include#include//以後的操作是要對陣列進行排序,從小到大。因為肯定是要從小到大進行過河

,最大的要留在最後,

using namespace std;

int main()

int dp[1009];

sort(a+1,a+1+n);

dp[1]=a[1];

dp[2]=a[2];

dp[3]=a[2]+a[1]+a[3];

for(int i=4;i<=n;i++)

cout << dp[n];

return 0;

}

動態規劃 小朋友過橋問題 C 版本 3中動態規劃

例1 例題1 在乙個夜黑風高的晚上,有n n 50 個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t i 兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。下面是...

過河問題(動態規劃)

在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題...

演算法 動態規劃 線性模型之小朋友過橋

題目 在乙個夜黑風高的晚上,有n n 50 個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t i 兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。輸入 兩行資料...