原创 POJ 2192 Zipper

定義dp[i][j]爲串1的前i個字符與串2的前j個字符最多能組成的串3前若干個字符 那麼,只有當dp[i][j]=i+j的時候往下轉移纔有意義,否則,不可能將串1和串2按照順序組成串3 並且此時必須同時滿足s1[i+1]=s3[i+j+

原创 HDU 3507 Print Artical

  狀態方程爲dp[i]=min{dp[j]+(sum[i]-sum[j])^2+m} ,0<=j<i 狀態轉移是O(n)的,總體複雜度爲O(n^2),對於n=500000顯然會超時 上網查了下,發現要用到斜率優化,找了些資料來看,理解了

原创 ural 1018 binary apple tree

給你一棵二叉樹,每條邊有一個權值,問你保留從根(1)開始的連在一塊的Q條邊,能獲得的最大值是多少先把邊上的權值轉到點上,N個點N-1條邊,即向根連一條虛擬邊,權值爲0,每條u->v上的權值轉到v上dp[i][j]表示以i爲根的子樹保留j個

原创 Codeforces 78E Evacuation

構圖的思路與POJ 2391是一樣的,對於從一個初級源點s出發的流,如果可到達的點是受限制的,可以先把這些受限制的點都找出來,拆點拆成i->i',然後,s向i'連邊, 最後,超級源點S向每個初級源點s連邊,每個點i'向匯點連邊 爲什麼要

原创 ural 1056 computer net

樹上每個點都有一個距離它最遠的點,題目要求所有最遠點中,具有最小最遠距離的是哪些點一個點,距離它最遠的點,要麼通過它的父節點到達,要麼通過它的某個孩子節點到達,顯然,一遍dfs不能得出結果我們先做一遍dfs,求出某點通過孩子節點最多可以向

原创 hdu 2415 Bribing FIPA

樹形DP,不同的是,只要選擇一個根節點i,它的子樹中的所有節點也被選擇,代價爲cost[i]由於dfs時,先遍歷子樹,再返回根節點,這樣,以i爲根的子樹中的節點可能被多次利用,解決辦法就是訪問到i時,先開一個tmp數組當前的狀態,即dp值

原创 POJ 2378 Tree Cutting 1655 Blancing Act

2378:給你一棵樹,如果把一個點去掉,則這棵樹將會被分割成若干塊,如果最大的一個連通塊中點的個數不大於N/2,則這個點是符合要求的點,求所有符合要求的點而1655則是求一個點,把它去掉後,得到的若干連通塊中有個點的個數最大值,這個最大值

原创 POJ 3093 Margaritas on the River Walk

給n個物品,容量爲V的包,要求這樣的方案數:選中k個物品放入揹包後,剩下的物品中,任意一個都放不進去考慮什麼情況下一個都放不進去,就是剩下物品中體積最小的那個(體積爲v)都放不進去,即揹包裝載容量應爲[V-v+1,V]那麼我們可以將物品按

原创 hdu 2639 Bone Collector II

求第k大的揹包每個容量v都對應k個不同的價值,當考慮放第i件物品,容量爲j時,價值爲第k大時,我們要麼不放,要麼放,那麼每個k就對應2個情況,dp[j][k]和dp[j-w[i]][k],總共有2×K種不同價值,那麼我們排好序後,取前K大

原创 POJ 3260 The Fewest Coin

FJ要買價值爲V的東西,他又N種貨幣,第i種的幣值爲Vi,數量爲Ai,老闆每種貨幣都有無數個,求最少需要多少張貨幣完成交易(FJ付出的加上老闆找零用的)先計算FJ付x元最少要幾張貨幣(多重揹包),然後計算找y元最少需要幾張貨幣(完全揹包)

原创 hdu 1561 The more,The better

樹形依賴揹包,用多叉轉換成二叉的形式解決一個節點兩個孩子,左孩子是它的孩子中的第一個,右孩子是它的第一個右兄弟,這樣一直遞歸下去,所以只有左孩子是節點的真正孩子dp[i][j]=max{dp[r[i]][j], dp[l[i][k]] +

原创 POJ 1935 Journey

給你一棵樹,要訪問樹上的m個節點,並且最後不用返回根,所走的最短距離是多少首先,可以把樹上不用走到的地方剪掉,那麼葉子節點都是要訪問的點要訪問所有葉子節點,那麼新的樹上的每一條邊都是有用的,並且只有一個葉子節點訪問完後不用返回考慮如果最後

原创 hdu 3449 Consumer

每組物品加入了箱子的限制,如果要買改組物品,就必須先買箱子考慮第i組物品時,前i-1組的最優值已經知道,假設總容量爲V,改組的箱子的代價爲p,那麼如果我們要買該組物品,可用容量就只有V-p,所以,我們先用tmp數組記錄前i-1階段容量範圍

原创 hdu 1060 Leftmost Digit

  設x=n^n,則log10(x)=a+b(a>0,0<=b<1) 那麼x=10^b*10^a,其中,10^b<10,那麼最左邊那位就是floor(10^b),注意精度和數據範圍     同理,最左邊的k位都是可以求的把10^b不斷乘以

原创 POJ 1984 Navigation Nightmare

並查集的應用,求解兩個點的曼哈頓距離 dx記錄子節點相對該集合代表的x偏移量,dy記錄子節點相對該集合代表的y偏移量   更新的時候注意相對偏移量的轉移即可,並且find操作時更新dx,dy 對於邊a->b,將find(a)的父節點指向b