0x50 動態規劃(練習)20 乾草堆(題解)

2022-05-09 16:22:52 字數 2444 閱讀 8785

題目鏈結

【題意】

奶牛們討厭黑暗。

為了調整牛棚頂的電燈的亮度,bessie必須建一座乾草堆使得她能夠爬上去夠到燈泡。

一共有n大包的乾草(從1到n編號)依靠傳送帶連續的傳輸進牛棚來。

第i包乾草有乙個寬度wi。

所有的幹草包的厚度和高度都為1。

bessie必須利用所有n包乾草來建立起乾草堆。

她可以想放多少包就放多少包來建立起草堆的地基(當然是緊緊的放在一行中)。

接下來她可以將下乙個草包放在之前一級的上方來建立新的一級。

注意:每一級不能比下面的一級寬。

她持續的這麼放置,直到所有的草包都被安置完成。

她必須按照草包進入牛棚的順序堆放草包。

說得更清楚一些:一旦她將乙個草包放在第二級 ,那麼她不能將接下來的草包放在第一級上。

bessie的目標是建立起最高的草包堆。

【輸入格式】

第1行:乙個整數n。

第2..n+1行:第i+1行包含整數wi。

【輸出格式】

輸出乙個整數,表示草包堆的最高的高度。

【資料範圍】

1≤n≤100000,

1≤wi≤10000

【輸入樣例】3 1

2 3【輸出樣例】

2

第一眼看到這個題目,wow,大水題,怕不是一道sb的貪心,出題人是不是s,為什麼要用dp。

只要頂層最小不就可以讓層數最多了嗎?

於是當快樂的打完**,發現wa了,馬上大罵出題人資料錯了。

6

9 8 2 1 5 5

╭(╯^╰)╮,肯定錯了,用我們的方法一看:|9 8 2 1|5|5|,三組呀,哪來的四組?不對!|9|8|2 1 5|5|!!!!

出題人:你大爺還是你大爺。。。

沒錯我們其實可以發現頂層最小有可能因為下面的一些小數字導致第二層很大,然後陷入惡性迴圈,有時候我們其實可以把一些小數字放到上面一層的。

於是我們又蹦出乙個思路,難道是下面一層最小且可以堆起來的話,層數一定是最大的?

雖然不能證明但是就是感覺是對的,上網一查,zkw巨佬已經證明了(一下做了一點點修改,方便看懂qmq):

任意取出乙個能使層數最高的方案,設有\(c_a\)層,把其中從下往上每一層最大的塊編號記為\(a_i\);任取乙個能使底邊最短的方案,設有\(c_b\)層(定義\(c_b,這樣可以嚴格證明一定存在乙個\(k\)),把其中從下往上每一層最大的塊編號記為\(b_i\)。 顯然\(a_<=b_\),這說明至少存在乙個\(k∈(1,c_b)\),滿足\(a_≥b_\)且ak≤bk。 也就是說,方案 a 第k 層完全被方案 b 第k 層包含。 構造乙個新方案,第k 層往上按方案 a,往下按方案 b, 兩邊都不要的塊放中間當第k 層。 新方案的層數與 a 相同,而底邊長度與 b 相同。證畢。

updata:(clb奆佬想的證明):

對於一組資料而言(反著想,從上往下堆乾草堆),假設\(i-1\)個乾草堆已經證明了此性質,對於\(i\)從右到左找到第乙個可以滿足下一層大於等於上一層的,不難發現\(i\)也是滿足的。(同時多加入新的乾草堆不會使層數減少。)

那麼我們就知道底層最小層數最小,而剩下的也是一直遵循底層最小來的。

那麼我們就可以把陣列倒過來,即往下疊,\(f[i]\)表示的是\(1-i\)最多疊幾層,且\(i\)所在的層的寬度最小化,為\(g[i]\),而\(s[i]自然就是字首和了\)。

那麼自然而然dp方程為:\(f[i]=max(f[j]+1)(j&&\(s[i]-s[j]>=g[j])\),這時候就要問了,為什麼這樣不怕後效性,即層數比\(f[i]\)小,但是底下一層也不\(g[i]\)小的一種方案,那麼就會有後效性,但是不會的,底下一層最小就是層數最多的情況,那麼只存在層數比\(f[i]\)小,但是底下一層也不\(g[i]\)大的情況,這個方案會有後效性?

我們將\(s[i]-s[j]>=g[j]\)化一下:\(g[j]+s[j]<=s[i]\)。\(s[i]\)單調遞增,那麼假設存在\(k,且\(g[k]+s[k]>g[j]+s[j]\),因為如果\(k\)滿足要求,\(j\)也是滿足要求的,而且\(f[k]<=f[j]\),那麼\(k\)就是不會被繼承的。

那麼維護乙個\(g+s\)遞增的序列,但是如何踢隊頭?如果\(head+1\)滿足情況就踢\(head\),因為越後面的\(f\)越大。

#include#include#define  n  110000

using namespace std;

int list[n],head,tail;

int n,s[n],g[n]/*第i層的寬度*/,f[n];

int main()

printf("%d\n",f[n]);

return 0;

}

選課 0x50 動態規劃 例題

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n n 300 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的...

0x50 動態規劃 傳紙條 線性DP

給定乙個 n m n mn m 的矩陣 a aa,每個格仔中有乙個整數。現在需要找到兩條從左上角 1,1 1,1 1,1 到右下角 n,m n,m n,m 的路徑,路徑上的每一步只能向右或向下走。路徑經過的格仔中的數會被取走。兩條路徑不能經過同乙個格仔。求取得的數之和最大是多少。n,m 50 n,m...

Acwing 0x50 動態規劃 沒有上司的舞會

題意 ural大學有n名職員,編號為 他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。...