小朋友過橋問題:在乙個夜黑風高的晚上,有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 兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。輸入 兩行資料...