題目:在乙個夜黑風高的晚上,有n(n <= 50)個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t[i],兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。
輸入:
兩行資料:第一行為小朋友個數n
第二行有n個數,用空格隔開,分別是每個小朋友過橋的時間。
輸出:
一行資料:所有小朋友過橋花費的最少時間。
樣例:輸入
41 2 5 10 輸出
17
解題思路:
我們先將所有人按花費時間遞增進行排序,假設前i個人過河花費的最少時間為opt[i],那麼考慮前i-1個人過河的情況,即河這邊還有1個人,河那邊有i-1個人,並且這時候手電筒肯定在對岸,所以opt[i] = opt[i-1] + a[1] + a[i] (讓花費時間最少的人把手電筒送過來,然後和第i個人一起過河)
如果河這邊還有兩個人,乙個是第i號,另外乙個無所謂,河那邊有i-2個人,並且手電筒肯定在對岸,所以opt[i] = opt[i-2] + a[1] + a[i] + 2*a[2] (讓花費時間最少的人把電筒送過來,然後第i個人和另外乙個人一起過河,由於花費時間最少的人在這邊,所以下一次送手電筒過來的一定是花費次少的,送過來後花費最少的和花費次少的一起過河,解決問題)
所以opt[i] = min。
來看一組資料 四個人過橋花費的時間分別為 1 2 5 10
具體步驟是這樣的:
第一步:1和2過去,花費時間2,然後1回來(花費時間1);
第二歩:3和4過去,花費時間10,然後2回來(花費時間2);
第三部:1和2過去,花費時間2,總耗時17。
**:
#include#include#includeusing namespace std;
int main()
sort(t,t+n);
vectorvect(n);
vect[0]=0;
vect[1]=t[1];
for (int i=2;i
動態規劃 線性DP
線性dp 即線性動態規劃,不侷限於 線性時間複雜度 的一維動態規劃。與數學中的 線性空間 類似,如果乙個動態規劃演算法的 狀態 包含多個維度,但在每個維度上都具有 線性 變化的 階段 那麼該動態規劃演算法同樣稱為 線性dp 在這類問題中,需要計算的物件表現出明顯的維度以及有序性,每個狀態的求解直接構...
動態規劃線性Dp LCS LIS
longest common subsequence 原題鏈結 給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。輸入格式 第一行包含兩個整數n和m。第二行包含乙個長度為n的字串,表示字串a。第三行包含乙個長度為m的字串,表示字串b。字串均由小寫字母構成。輸出...
動態規劃 線性dp 初級
攔截飛彈 洛谷p1020 飛彈攔截 o n logn 的解法 dilworth定理 定理1 令 x,是乙個有限偏序集,並令r是其最大鏈的大小。則x可以被劃分成r個但不能再少的反鏈。其對偶定理稱為dilworth定理 定理2 令 x,是乙個有限偏序集,並令m是反鏈的最大的大小。則x可以被劃分成m個但不...