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

題目:數組

  在一個夜黑風高的晚上,有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));
    }

}
相關文章
相關標籤/搜索