題目:數組
在一個夜黑風高的晚上,有n(n <= 50)個小朋友在橋的這邊,如今他們須要過橋,可是因爲橋很窄,每次只容許不大於兩人經過,他們只有一個手電筒,因此每次過橋的兩我的須要把手電筒帶回來,i號小朋友過橋的時間爲T[i],兩我的過橋的總時間爲兩者中時間長者。問全部小朋友過橋的總時間最短是多少。spa
輸入:code
有序數組(自定爲有序,實際任意,數組內的數字表明對應索引過橋的時長)、數組長度blog
輸出:索引
累加最短的時間class
實現:im
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)); } }