1. 程式人生 > >動態規劃--樹形依賴揹包

動態規劃--樹形依賴揹包

    樹形依賴揹包是子樹依賴父親才能產生貢獻的一類問題。
    有三種種解決的辦法:
        1.強制選擇當前節點,用當前的狀態去更新子樹資訊,然後再用子樹資訊更新父親。
        2.對於這一類問題,只有選擇了父親節點,才能選擇子樹。所以我們用dfs序來進行dp,對於子樹,再dfs序上是連續的一段,可以考慮前i個dfs序帶來的最大收益,正常的揹包即可,稍微注意整個子樹都不選的更新即可。
        3.第三種解決方法比較巧妙,將多叉樹轉為了二叉樹。對於正常的樹而言,我們的左右兒子都是兒子節點,但是在轉化中,我們將當前節點的左兒子設定為它的任意一個兒子,將它的右兒子連線為與它所有深度相同的節點。這樣對於選擇當前節點就可以沿著左兒子走,否則只能沿著右兒子走,二維DP即可。

相關推薦

動態規劃--樹形依賴揹包

樹形依賴揹包是子樹依賴父親才能產生貢獻的一類問題。 有三種種解決的辦法: 1.強制選擇當前節點,用當前的狀態去更新子樹資訊,然後再用子樹資訊更新父親。 2

動態規劃-07依賴揹包

按照《揹包九講》的順序,本文主要講其第七講-依賴揹包,所謂“依賴揹包”即指揹包物件有主附件,類似的解釋之前在“二維費用揹包”中提到過,不過這裡的主附件是從屬關係,即選擇主件,必須要選擇附件,而附件的類別又可以有很多種,同樣的附件也可以有附件,這樣如此反覆,即會形成一個“樹形D

【DP】計劃11.8——(樹形依賴揹包總結)&&分數規劃思想

樹形依賴揹包指的就是一類具有樹形依賴關係的揹包問題。當選一個物品的前提是選另一件物品,而這些依賴關係構成了一個樹形關係。在容量有限的情況下,然後求最大的價值,這類問題我們就稱之為樹形依賴揹包。 樹形依賴揹包問題實際上是一類分組揹包問題,我們可以將每個點的子樹看成

動態規劃-樹形DP-樹上背包專題

ace 整數 return urn edge 最大 沒有 != 格式 先看道題:選課 題目描述 在大學裏每個學生,為了達到一定的學分,必須從很多課程裏選擇一些課程來學習,在課程裏有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。 現在有N門功課,每門課有個

[動態規劃][樹形dp]Bichrome Tree

stream ace cat 提示 題目 inpu rmi code inf 題目描述 We have a tree with N vertices. Vertex 1 is the root of the tree, and the parent of Vertex i

採藥-動態規劃(01揹包

採用一維陣列進行優化 #include<cstdio> #include<algorithm> using namespace std; int w[105], v[105]; int dp[1005]; int main() { int m, n; sca

動態規劃-0-1揹包問題

給定n個物品和一個揹包。物品i的重量為wi,價值為vi,揹包容量為c。問如何選擇裝入揹包中的物品,使得裝入揹包的物品的價值最大?在裝入揹包時,每種物品i只有兩種選擇,裝入或者不裝入,既不能裝入多次,也不能只裝入一部分。 因此,此問題稱為0-1揹包問題.0-1揹包問題是一個特殊的整數規劃問題。

POJ-2184 Cow Exhibition 【動態規劃DP+01揹包變換】

題目傳送門 題目:共有N頭牛,接下來N行是每頭牛的智商和情商,從這些牛中任意選取若干頭牛,使得牛的智商和+情商和最大,同時智商和(TS),情商和(TF)都不小於0。 題解:以智商作為容量,求前i頭牛在智商為j的情況下的最大情商 。因為有負數,所以容量擴大100000,修改dp陣

HDU-2844 Coins 【動態規劃DP+多重揹包

題目傳送門 題目:有n種硬幣,第i種硬幣的價值為Ai,數目為Ci,求這些硬幣能配出1~m中的幾種價值。 題解:dp[j]表示是否能配出價值j。sum[i][j]表示第i種硬幣取到價值j時需要的數目。sum陣列可以壓掉i的那一維,每次都要記得清零。 AC程式碼: #include

POJ-2392 Space Elevator 【動態規劃DP+多重揹包

題目傳送門 題目:牛要去太空了!他們計劃通過建造一種太空升降機來達到軌道:一個巨大的積木塔。他們有K (1 <= K <= 400)不同型別的積木來建造塔。型別i的每個塊的高度都是h_i (1 <= h_i <= 100),並且數量上都是c_i (1 <= c_

動態規劃之完全揹包問題(java實現)

之前寫了01揹包問題,現在寫完全揹包問題。和01揹包不同的是,完全揹包不限定某種物品的件數,可以裝0,1,2,...,而01揹包只有裝與不裝的區別。但是思考問題的方式還是一樣的,我就其中的最大值。詳細程式碼和註釋見下面程式碼。 package backpack; /* f[i][v]:前i件物

BZOJ.4910.蘋果樹(樹形依賴揹包 DP 單調佇列)

BZOJ 洛谷 \(shadowice\)已經把他的思路說的很清楚了,可以先看一下會更好理解? 這篇主要是對\(Claris\)題解的簡單說明。與\(shadowice\)的做法還是有差異的(比如並沒有明顯用到後序遍歷的性質),而且用這種寫法可能跑的比較輕鬆? 問題等價於樹形依賴揹包,允許一條鏈每個

動態規劃 0-1 揹包問題 python

#有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和? #number=4,capacity=8 在程式中用n表示物品數量,用j表示剩餘容量 w = [0,2,3,4,5]#表示重量 v = [0,3,4,5,6]#表示價值 #列出模型遞推式

bzoj4753(分數規劃+樹形DP+揹包DP+複雜度分析)

把0看做一個需要取的點,那麼通過題目給的約束條件這就變成了一個樹形揹包DP。。 然而這個比率貌似不好決策。。於是用分數規劃,這樣權值改變之後就變成常規樹DP 然後一個顯然的做法是在已取根節點的前提下把子樹的揹包合併到根上面去,可是會發現合併揹包的代價非常大,合併一次的複雜

洛谷 P2014 選課 樹形依賴揹包

題目描述 在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有N門功課,每門課有個學分,每門課有一

【leetcode】動態規劃之01揹包問題

先學會手動填動態規劃的表  後面的顏色塊值是根據前面的顏色塊值計算出來的,不懂就留言 #include<iostream> #include<vector> using namespace std; int Knapsack(vector<i

再學動態規劃之 完全揹包

暴力搜尋 考慮當前index 拿1張,2張,…時候,從index+1開始的最小張數。相加即可: import sys class Solution(object): def get_smal

動態規劃】--01揹包問題

o1揹包問題:一個揹包體積為V, 現有n個物品,第i個物品體積為w[i],價值為c[i]。問在不超出揹包 容量前提下,揹包 最多能裝下多少價值的物品。 之所以叫01揹包是因為這類題都可以歸結為第i個物品 放還是不放問題。這裡用二維陣列表示(當然也可用一維) 若第i個物品放

Codeforces 815 C 樹形依賴揹包 解題報告

C. Karen and Supermarket On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a lot