題目名我已經無力吐槽。
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 中,...