JZOJ 4210 我才不是蘿莉控呢!

2021-07-05 02:29:16 字數 2854 閱讀 3548

題目名我已經無力吐槽。

a:你是蘿莉控嗎?

b:。。。。。我給你道題目吧!

有乙個長度為

n 的正整數陣列

a,滿足ai

>=ai

+1,現在構造乙個陣列

b ,令bi

=∑nj

=ibj

。 現在,有乙個n∗

n 的網格圖,左下角座標是(1

,1) ,右上角座標是(n

,n) 。有乙個人正在座標為(n

,1) 的位置,每一時刻,如果他現在在(x

,y) ,他可以選擇走到(x

−1,y

+1) 或者(x

,⌈y/

2⌉) ,如果選擇後者,他要支付bx

的代價。

現在他想走到(1

,1) ,你可以告訴他他支付的代價最少是多少嗎?注意在任何時候他都不能離開這個網格圖。

模擬。

直接走。搜尋。30分。

其實這個搜尋可以寫成dp。 fi

,j=m

in(f

i+1,

j−1,

fi,j

∗2+b

i,fi

,j∗2

−1+b

i)這就60了。

根據這題的dp式,我們想到乙個老朋友:哈夫曼樹。

首先【前提】,你得對哈夫曼樹的dp形式足夠熟悉。

哈夫曼樹的點,我們按照權值ci

從小到大排序,依次加入樹中。

我們設gi,

j 表示當前正在把第

i 個點放進哈夫曼樹里,此時樹上有

j個空節點的最小代價。所謂空節點,就是放了不用增加代價的點(gi

,j中預支了剩餘的點放在這

j 個空節點的代價)

那麼轉移就很明郎了。我們用順推來便於記憶和理解。 gi

,j⇒g

i+1,

j−1,

gi,j

+∑j=

incj

⇒gi,

j∗2也就是說,當前狀態下,要麼把

i 塞到

j個空位的某乙個裡面,要麼把每個空位都變成輔助節點,這樣每個空位就都能多掛乙個葉子節點了。相應的,這樣一來剩下的所有空位置【能放的葉子節點】到根的距離都多了1,由於這些位置是為i→

n 準備的,所以代價要加上∑n

j=ic

j 答案就是mi

n(gn

+1,k

0≤k≤

maxj

) 你問我為什麼要每個空位都變成輔助節點?難道不能單開乙個或者僅僅是幾個嗎?

因為這樣狀態是重複的。假如我們僅僅單開了

k 個空位變成輔助節點,總空位數一定可以由之前的某個狀態的空位置數推導而來,所以我們只需要考慮一起開就好了。

這就是哈夫曼樹的dp形式。

關於哈夫曼樹的經典演算法我們就不贅述了,o(

nlogn)

。這和我們這一題有什麼關係呢?fi

,j=m

in(f

i+1,

j−1,

fi,j

∗2+b

i,fi

,j∗2

−1+b

i) 把

b 展開fi

,j=m

in(f

i+1,

j−1,

fi,j

∗2+∑

j=in

aj,f

i,j∗

2−1+

∑j=i

naj)

gi,j

⇒gi+

1,j−

1,gi

,j+∑

j=in

cj⇒g

i,j∗

2 g 和

f是不是非常的像,簡直就是逆過程!除了最後一項。

我們考慮一下gi

,j∗2

和 gi

,j∗2

−1的差別。同是由gi

,j推過來的,少乙個空位難道會比多乙個空位更優嗎?顯然是不會的,暫且不論這個空位能不能用上,gi

,j∗2

≤gi,

j∗2−

1 我們來檢測一下。

c 是遞增的,

a也是。 g1

,1=0

求的是 mi

n(gn

+1,k

0≤k≤

maxj

) fn

+1,0

=0求的是 f1

,1這裡產生了一點差異,就是fn

+1,0

,那麼我們的mi

n(gn

+1,k

0≤k≤

maxj

) 其實等於什麼呢?

對於這個最終答案,我們的哈夫曼樹可以是多叉的。

鑑於題目特殊性,我們看看二叉的哈夫曼樹有什麼特殊性質。

對於乙個最優的二叉哈夫曼樹,一定不存在掛空的空節點。

證明:如果最優的二叉哈夫曼樹存在某個空節點,必定存在乙個葉子節點的對應位置為空。那麼我們可以把這個葉子節點往上移,刪除這個空節點,達到更優的解法。與題設的最優性質衝突,所以對於乙個最優的二叉哈夫曼樹,一定不存在掛空的空節點。證畢。

此時,原問題就是哈夫曼樹問題的逆問題。由於這是乙個遞推,所以兩問題等價。

就是很隱蔽的哈夫曼樹。

這題比noi的哈夫曼樹隱蔽的多了。

要對哈夫曼樹的dp形式足夠熟悉和敏感。

正所謂吃一塹長一智,下次不會眼瞎了。

突破點:ai

>=ai

+1,bi=

∑nj=

ibj , (x

,⌈y/

2⌉)

ps.本校的不懂的請問富欖

4 21學習總結

今天學習了有關python的一些相關知識 使用方法 import requests 引入 def download all htmls 設定乙個函式 htmls url f f是為了使字串格式化 print craw html url r requests.get url 得到網頁內容,狀態碼應為2...

421 簡化路徑 ( 棧 )

lintcode 421.簡化路徑 利用 stack 棧 乙個點 表示當前目錄本身 此外,兩個點 表示將目錄切換到上一級 指向父目錄 輸入 a c 輸出 c 期望答案 c 可以理解成無用的,我們只需要關心 返回上一級,即將上乙個壓入棧的目錄名字彈出棧 ac code public class sol...

4 2 1 載入和解析資料

4.2.1 載入和解析資料 作為第一步,我們將實現乙個函式 convertdatarow,它從這個 csv 檔案中取一行作為字串,從這一行中返回兩個元件到乙個元組中。實現這個函式後,立刻測試它,通過給它乙個示例輸入 字串 testing reading,1234 應該能正確解析。在清單 4.2 中,...