為了機試開始苦逼學習演算法。。。學習過程中記錄下一些對問題的理解,有些問題網上雖然有很多答案,不過大多千篇一律,有很多難以理解的地方,這裡著重理解,具體的演算法還是參考其他人吧。
問題:在乙個夜黑風高的晚上,有n(n <= 50)個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t[i],兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。
這裡參考了這裡的講解最終大家都能得到這個遞迴方程: opt[i] = min
opt[i-1] + a[1] + a[i] 是第一項
opt[i-2] + a[1] + a[i] + 2a[2] 是第二項
但是這個方程讓人難以理解,我對這個方程有兩個疑問:
1、剩下1個人的那個情況不應該是已經包含了剩下兩個人的情況了嗎
2、剩下兩個人的情況裡,讓a[1]跟a[i]一起回去,再讓a[1]送一次手電筒不行嗎,這樣的時間應該是opt[i-2] + a[1] + a[i] + a[1] + a[i-1]
仔細思考,這兩個問題實際上指向了同個問題。其實確實最終的情況應該是只剩乙個人,哪怕在剩兩個人的情況的中間過程中也是只剩下乙個人,但是這裡會出現選擇上的問題,也就是我的問題2,到底該讓誰先回去,是a[i]跟某個人一塊過河,還是讓a[i]跟a[1]一塊過河,其中第二個選擇跟遞迴方程的第一項是一樣的,第乙個選擇是不一樣的,所以實際上opt[i-2] + a[1] + a[i] + a[1] + a[i-1]可以合併為opt[i-1] + a[1] + a[i](從數學角度也好理解),所以這裡直接就寫opt[i-2] + a[1] + a[i] + 2a[2]就好了,因為另乙個情況已經在opt[i-1] + a[1] + a[i] 中體現了。
剛剛開始學習演算法,還有很多需要理解的地方啊。。。。
動態規劃 小朋友過橋問題 C 版本 3中動態規劃
例1 例題1 在乙個夜黑風高的晚上,有n n 50 個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t i 兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。下面是...
動態規劃程式設計題加課 手電過橋問題
此題最難的是切入思路。我一開始糾結於過橋順序的多種情況。後來發現思路要從時間最大者切入。時間最大者t n過橋的時間一定會被計入總時間,因為沒有人可以帶他。那麼t n過橋的順序其實不重要,他過橋的策略只有兩種 1.帶同伴過橋,同伴送手電回來。2.帶同伴過橋,第三者送手電回來。要有第三者回來,那麼必然先...
演算法 動態規劃 線性模型之小朋友過橋
題目 在乙個夜黑風高的晚上,有n n 50 個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t i 兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。輸入 兩行資料...