hdu 1011 樹型DP(依賴揹包)

2021-06-07 21:16:29 字數 1874 閱讀 7837

題意:你作為星河站隊的leader,手下有m個trooper;現在讓你去攻占乙個基地:有n個洞穴組成,

入口是洞穴1,

洞穴之間用n-1條邊鏈結,每個洞穴裡面包括x個

bugs,和他們的brains,你的每個trooper可以消滅20個bugs;問你最多可以得到多少個brains。

需要注意的是:你沒做過的葉子必須要留人,也就是說就算某個地方的bug是0個,你也要牌乙個trooper過去。

寫這個題目的時候,開始用的是以前的依賴揹包的思想,而且**也是按照依賴揹包寫的,寫的比較長,也比較繁瑣,主要思路是:

因為入口是1,所以從1開始,設p=1,p是訪問到的節點編號,設dp[i]表示i是需要的trooper數量,當作**,dp[i]是得到的brains數量,當作價值:

1、遍歷p的所有孩子,如果p的孩子i還有孩子,p=i,轉到1,遍歷完以後,如果所有的孩子都沒有子孩子,轉到2,否組轉到3;

2、對所有的孩子進行01揹包:初始化dp都是p的價值,然後進行01揹包,然後把dp[i]對應的值都後移p的**。

因為如果想到到達p的孩子,必須到達p。然後回溯到上一層1,繼續遍歷p;

3、由於p的有些孩子還有孩子,那麼處理的時候就要按照不同的情況進行01和分組揹包處理,對於沒有孩子的孩子,按照01揹包處理,對於有孩子的孩子,對其進行分組揹包的處理,然後回溯到上一層1繼續遍歷p;

**如下:

/*#include #include #include #include #include using namespace std;

#define n 110

int num,total_price,dp[n][n];

struct roomroom[n];

bool visited[n];

vector connected[n];

void init()

for(i=1;i=room[key].price;j--)}}

}int main()

room[n*n];

bool map[n][n],de_room[n],de_map[n];

list tree[n];

int num,total_price,ans,num_i,num_j;

void update(int key)

}list ::iterator p=tree[key].begin();

while(p!=tree[key].end())

}void fun(int key)

}else

}tree[*p].clear();

}p++;

}tree[key].clear();

if(key==num_i)

for(i=total_price;i>=0;i--)

if(i+room[key].price<=total_price)

}}int main()

for(i=1;i

**如下:

#include #include #include #include #include using namespace std;

#define n 110

int num,total_price,dp[n][n];

struct roomroom[n];

bool visited[n];

vector connected[n];

void init()

for(i=1;i=room[key].price;j--)}}

}int main()

{ while(cin>>num>>total_price&&((num+1)||(total_price+1)))

{init();

if(!total_price)

{cout<<"0"<

hdu1011(揹包樹形DP)

沒有完全理解這題,m個人,攻打乙個map,map的入口是1,在攻打某個結點之前要先攻打其他乙個結點 dp i j 表示m個人攻打以第i個結點為根節點的子樹得到的最優解 狀態轉移dp i j max dp i j dp i k dp t j k 其中t是i結點的子節點 如下 include inclu...

HDU 1011 星河戰隊 樹形DP

題意是說在乙個洞穴中有許多房間,每個房間中有一些蟲子和大腦,這些房間之間用隧道相連形成一棵樹,士兵們殺蟲子的能力有限,也可以直接殺死蟲子而不消耗士兵戰鬥力,但這樣就無法得到房間中的大腦,士兵們不能走回頭路,問給定士兵數量時能得到的大腦最大值。在樹上進行動態規劃,對於每個節點來說,選擇了它,就要損失士...

HDU 攻城堡 (依賴揹包 樹形dp)

acboy很喜歡玩一種戰略遊戲,在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中acboy允許攻克m個城堡並獲得裡面的寶物。但由於地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某乙個特定的城堡。你能幫acboy算出要獲得盡量多的寶物應該攻克哪m個城堡嗎?每個測試例項首...