1. 程式人生 > >動態規劃之線性模型之小朋友過河——Java實現

動態規劃之線性模型之小朋友過河——Java實現

動態 color str 情況 oid 實現 nbsp mce void

題目:

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

輸入:

  有序數組(自定為有序,實際任意,數組內的數字代表對應索引過橋的時長)、數組長度

輸出:

  累加最短的時間

實現:

public class 自底向上實現線性模型 {

    private static int minTime(int p[],int n){
        
int opt[] = new int[n+1]; for (int i = 0; i < n; i++) { opt[i] = p[i]; } int minTime = 0; // 沒有人的情況下 if (n == 0) return 0; // 有一個人時,返回這個人的時間 if (n == 1) return p[n-1]; // 有兩個人時,返回用時較多的人的時間 if
(n == 2) return Math.max(p[n-1],p[n-2]); /** * 人數多於2時,采用動態規劃的思想,將問題拆分 * 假設河的這一側還剩一人,則派遣最快的人往返 * 假設河的這一側還剩二人,先派遣花費時間最少的人過來,待這兩人走後,花費時間此少的人過來攜帶最少的人一同回去 */ for (int i = 2; i < n; i++) { opt[i] = Math.min(opt[i-1]+p[0]+p[i],opt[i-2]+p[0]+p[i]+2*p[1]); minTime
= opt[i]; } return minTime; } public static void main(String[] args) { System.out.println(minTime(new int[]{1,2,5,10,11},5)); } }

動態規劃之線性模型之小朋友過河——Java實現