演算法如下:
如果把每乙個點在xy軸上連成線,會發現乙個折線圖,可以發現,在折線圖之中,如果在折線圖中找到任何乙個極大值(波峰),
然後將它與旁邊兩個點中比較大的那乙個結合,不會影響這個極大值左邊和右邊的其他節點的結合的最大可能值。
因此,上述可以實現提供貪心演算法。該貪心演算法可以通過stack實現。
1.初始條件:
stack中元素從棧低到棧頂為單調不遞減
2.迴圈不變式:
讀入乙個元素buf,
1)如果這個元素大於stack頂部元素(stack元素的最大值)
,就把這個元素壓入棧.
(顯然不會影響stack單調性)
2)否則,pop出棧頂元素,最大結合計數值增加((出棧之後的棧的棧頂)和buf的最大值)。(相當於極大值和左邊/右邊的元素中大的相結合)(也不會影響單調性)
3)然後返回第一步。
3.終止條件:
當全部元素被壓入棧(或者被結合除去了),就可以終止迴圈了
4.處理最後的資料:
此時把棧中元素相當於單調遞增的折線,組合出最大費用非常簡單。
#include
using
namespace std;
intmain()
st.push
(buf);}
while
(st.
size()
>2)
cout << cnt << endl;
}return0;
}
不死神兔問題
規則 a 從第三項開始,每一項都是前面兩項之和 b 而且說明前面的兩項是已知的 c 陣列實現 d 變數的變化實現 實現 如下 以20個月為例,三種方法實現 public class resursiondemo2 system.out.println 第20個月不死神兔的個數是 arr 19 syst...
遞迴 不死神兔和啤酒問題
本次針對上次遞迴遺留問題編寫出對於 當然,解決方案很多,只供參考.有一對兔子,從出生後第三個月起每月都生一對兔子,小兔子3個月後又生一對兔子,加入兔子都不死,問第20個月後兔子對數是多少?這道題依然用遞迴的方法解決 public static int arithmetic int number el...
問題 D 筷子
題目描述 a先生有很多雙筷子。確切的說應該是很多根,因為筷子的長度不一,很難判斷出哪兩根是一雙的。這天,a先生家裡來了k個客人,a先生留下他們吃晚飯。加上a先生,a夫人和他們的孩子小a,共k 3個人。每人需要用一雙筷子。a先生只好清理了一下筷子,共n根,長度為t1,t2,t3,tn.現在他想用這些筷...