原创 揹包的第k優解(dp-揹包-狀態記錄)

一句話題意已經在題名裏了。 顯然,這裏必須要決策的過程當中不斷地記錄下前k優解。我們在0-1揹包的基礎上增加一維f[k][j]表示揹包裝的物品體積爲j時的第k優解。 對於每次決策f[j]=max(f[j],f[j-w[i]]+v

原创 Codeforces 474D 蛋糕(dp-遞推)

無敵水題,實際上樣例解釋就暴露了它遞推的本質。 f[ i ]表示喫 i 個蛋糕的方案數。 那麼,f[ i ]=f[ i-1 ]+f[ i-k ]; ( i >k ) 這個遞推和走樓梯很像。即當前i個蛋糕,可以分爲兩種情況:喫

原创 #454 最大利潤(樹形dp)

貫徹樹形dp第一維通常是節點編號的思想,f[i]表示以i點爲根的子樹的最大利潤。根據題意,相連的兩點不能同時取,故可想到增加一維表示i點取或不取:f[ i ][ 0 ]表示不取,f[ i ][ 1 ]表示取。 那麼我們就可以列出

原创 Codeforces 432D 完美子串 + 51nod 1129 字符串最大值(dp-kmp)

我覺得我能A這題完全是因爲前一天晚上做了很類似的。 字符串,前綴後綴,出現次數,關鍵詞一拼就是kmp。 首先我們考慮第二問的第二個數,怎麼求得一段前綴子串在 s 中出現的次數。這裏需要我們深入地瞭解next數組的含義。 呃,

原创 配置魔藥(dp-雙進程)

根據求什麼設什麼原則,f[k][i][j]表示放第k種魔藥、第一個坩堝時間爲i、第二個坩堝時間爲j時的最大藥效。 設第k種藥的起始時間爲a[k].st,結束時間爲a[k].sw。 那麼可得狀態轉移方程: f[k][i][j]=

原创 構建雙塔(dp-雙進程)

f[i][j] 表示取前i塊水晶、兩塔差爲j時較高塔的最大高度。 注意,這裏的f[i][j]都是從上一階段推得的。我們在面對第i塊水晶時,它可能是從以下四種決策得來的: f[i][j]=max(f[i-1][j]) ; 這塊水晶

原创 Codeforces 245H 迴文串(區間dp)

仍然是區間dp。這題相對好推一點。 設f[ i ][ j ]表示 [ i,j ] 的迴文串個數。 so,一般地,f[ i ][ j ]=f[ i ][ j-1 ]+ f[ i+1 ][ j ] - f[ i+1 ][ j-1

原创 矩陣連乘(區間dp)

f[i][j]表示第i~j個矩形相乘所得的最少乘法次數。 設a[i][j].x/y分別爲第i~j個矩形連乘(最優方案)所得的x/y。 則可得狀態轉移方程: f[i][j]=max(f[i][l]+f[l+1][j]+a[i][

原创 東莞市選 格鬥俱樂部(區間dp)

【問題描述】   格鬥俱樂部是格鬥愛好者的一個組織,在這裏,格鬥者們能通過與別的成員進行格鬥來釋放自己的壓力與輕鬆自己的情緒。最近俱樂部舉行了一場比賽,該比賽有N位選手參加,他們將圍成一個圓圈,每一場比賽圈內任意的兩位相鄰的選手

原创 音量調節 changingsounds(dp-分組揹包)

時間限制:1秒 問題描述 一個吉他手準備參加一場演出。他不喜歡在演出時始終使用同一個音量,所以他決定每一首歌之前他都要改變一次音量。在演出開始之前,他已經做好了一個列表,裏面寫着在每首歌開始之前他想要改變的音量是多少。每一次改變

原创 hdu 1176 免費餡餅 (dp)

免費的陷阱。 第一眼嘛,FJ摘蘋果,但是n<=1e5,O( n^2 ),穩定TLE。 那麼尋找別的思路,通過觀察發現x的範圍很小,[0.10],遂採取暴力措施,設 f[ i ][ j ] 表示第 i 秒,以(必須)站在 j 爲

原创 Codeforces 366C 水果(dp-01揹包)

我是真心覺得它難的。 第一反應暴搜,2^100,算了。想了很久很久的各種設置狀態的方法,都沒法順利進行狀態轉移。 正解是這樣的: 可得:∑aj=k*∑aj ( j:[ 1,m ] ); 那麼,我們創造一個數組 g[ i

原创 Codeforces 149D 括號染色(區間dp)

看到括號就不想做…………所以真的沒做。考完看了題解,發現還是很好推的。 首先,預處理出括號匹配。這一步用棧可以很簡單地完成,即:掃描字符串,遇到 ‘(’ 壓入棧,遇到 ‘)’ 就彈出棧頂與之匹配,其正確性肉眼可見。 下面我們用m

原创 Codeforces 700B 友好城市(樹形dp)

感覺現在的我還比較難想到這個思路啊。 距離累加和,是由邊決定的,所以我們計算每條邊的貢獻。 可以知道,對於一條邊e,如果起點端有 x 個友好城市,終點端有 y 個友好城市,那麼這條邊的最大貢獻就是 min( x,y ),因爲少

原创 noi2011 道路修建(樹形dp)

無根樹,揪出結點1當根。 dfs求f[i]子樹大小。 對於點i以及與之相連的點j,可知i一側的點數爲f[i],j一側爲n-f[i],故修路費用即爲e[i].v*abs(n-2*f[e[i].y])。e[i].v是道路長度。 注意