題目大意
當farmer john閒下來的時候,他喜歡坐下來讀一本好書。 多年來,他已經收集了n本書 (1 <= n <= 100,000)。 他想要建立乙個多層書架,來存放它們。 每本書 i 擁有乙個寬度 w(i)和乙個高度 h(i)。 所有的書需要按順序,放到書架的每一層。 舉例來說,第一層書架放k本書,應該放書1...k;第二層書架從第k+1本書開始放……。 每層書架的寬度最多為l (1 <= l <= 1,000,000,000)。 每層書架的高度為該層最高的那本書的高度。 書架的總高度為每層書架高度之和。 請幫fj計算書架可能的最小總高度。
分析 一眼就看出是dp
(因為每天的第四或第三題都是dp)
最簡單的方程是
f[i]=min
其中w[j]+w[j+1]...w[i]<=l。
但是這個東西是o(n²),會超時。所以聯絡到求最大值,可以想到用最大值的單調佇列,佇列裡面存放的是以 i 為結尾,視窗裡面的元素和恰好不大於 m 的 j 為左邊界,即恰好有 sum[i] - sum[j-1] <= m.同時h也用單調佇列優化。
然後這樣乙個可行解就是,f[ i ]=f[j]+h[a[r]](即隊首元素的值), 這並不是最優解,所以還要找到佇列中的最優解,乙個可能的最優解只能是這樣的f[i]=f[a[r-1]]+h[a[r]],也就是 a[ r ] 要大於後面的數,很顯然,如果a[ r]小於後面的數,那麼我們就可以將 a[ r ] 劃分到後面去,而取得更優解。這裡涉及的這個找最優解問題,可以用set。
看不懂的自行腦補(雖然我也不是很知道我在打什麼,具體的見**)
又是他——
蜜汁c++ **
#include #include #include #include using namespace std;
typedef long long ll;
ll que[100100],a[100100],dp[100100],b[100100];
ll n,m,sum;
ll i,j,k;
ll front,rear,p=1;
multiset lxf; //erase insert begin
int main()
front=1; rear=1;
dp[1]=a[1];que[rear]=1;
sum=b[1];
for(i=2;i<=n;i++)
rear=rear+1;
que[rear]=i;
if (front
區間 紀中1382 dp
alice收到一些很特別的生日禮物 區間。即使很無聊,alice還是能想出關於區間的很多遊戲,其中乙個是,alice從中選出最長的不同區間的序列,其中滿足每個區間必須在禮物中,另序列中每個區間必須包含下乙個區間。程式設計計算最長序列的長度。輸入檔案第一行包含乙個整數n 1 n 100000 表示區間...
跳舞 紀中2545 dp
小明今天得到乙個跳舞毯遊戲程式dance。遊戲每次連續出n 個移動的 箭頭 箭頭依次標號為1 到n,並且的相應的分數s 1.n 如果你能 踏中 第i 號箭頭,你將獲得相應的分數s i 否則將被扣除相應的分數。另外,遊戲還有乙個累計獎勵機制 如果踏準次數累計達到t,並且是在踏中第i個箭頭達到的,則將得...
邦德 紀中 1236 狀壓dp
題目大意 每個人都知道詹姆斯邦德,著名的007,但很少有人知道很多任務都不是他親自完成的,而是由他的堂弟們吉公尺邦德完成 他有很多堂弟 詹姆斯已經厭倦了把乙個個任務分配給乙個個吉公尺,他向你求助。每個月,詹姆斯都會收到一些任務,根據他以前執行任務的經驗,他計算出了每個吉公尺完成每個任務的成功率,要求...