codevs1486愚蠢的礦工(樹形dp)

2022-04-06 04:32:38 字數 1498 閱讀 6406

時間限制: 1 s

空間限制: 128000 kb

stupid 家族得知在hyc家的後花園裡的**花壇處,向北走3步,向西走3步,再向北走3步,向東走3步,再向北走6步,向東走3步,向南走12步,再向西走2步( - -||)就能找到寶藏的入口,而且寶藏都是藏在山里的,必須挖出來,於是stupid家族派狗狗帶領礦工隊去挖寶藏.(hyc家的寶藏被狗狗挖走後有什麼感想?)

這個寶藏的製造者為了掩蓋世人耳目,他做的寶藏是沒有出口,只有入口,不少建造寶藏的人都死在裡面.現在知道寶藏總共有n個分岔口,在分岔口處是有財寶的,每個寶藏點都有乙個財富值.狗狗只帶了m個人來,而且為了安全起見,在每個分岔口,必須至少留乙個人下來,這個留下來的人可以挖寶藏(每個人只能挖乙個地方的寶藏),這樣才能保證不會迷路,而且這個迷宮有個特點,任意兩點間有且只有一條路可通.狗狗為了讓他的00開心,決定要盡可能地多挖些寶藏回去.現在狗狗的圈叉電腦不在身旁,只能求救於你了,你要知道,狗狗的終身幸福就在你手上了..(狗狗ps:00,你不能就這樣拋棄偶……)

資料範圍

對於10%的資料,n<10

對於100%的資料,n<=1000

輸入描述 input description

第1行:兩個正整數n,m .n表示寶藏點的個數,m表示狗狗帶去的人數(那是一條懶狗,他自己可不做事)。(m<=100)

第2行:n個整數,第i個整數表示第i個寶藏的財富值.(保證|wi|第n+2行:兩個非負整數a和b,表示a通向b,當a=0,表示a是入口.(保證a,b<=n)

輸出描述 output description

輸出狗狗能帶回去的寶藏的價值。

樣例輸入 sample input

4 35 6 2 4

1 20 1

2 33 4

樣例輸出 sample output

/*

樹形dp f[i][j]表示當前節點為i,還剩j個人能獲得的最大價值。

多叉樹轉二叉樹,左兒子右兄弟

所以不能只選左孩子,但可以不選當前節點,只選右孩子

轉化好了之後就是dp了。

寫的記憶化 遞迴每個節點 列舉分給左右孩子的人數

*/#include

#include

#include

#define maxn 1010

using

namespace

std;

intn,m,ans,x,y;

int f[maxn][maxn],a[maxn],son[maxn][3

];int dp(int root,int

cnt)

if(f[root][cnt]maxx;

return

f[root][cnt];

}int

main()

}ans=dp(son[0][1

],m);

printf(

"%d\n

",ans);

return0;

}

題解 codevs 1486 愚蠢的礦工

我們比較熟悉二叉樹,題目中給出的是一棵多叉樹,我們需要將這可二叉樹改造成二叉樹。二叉樹可以為這樣的 父親結點左邊儲存兒子,右邊儲存兄弟。有兩種改造方法 if tree x l 0 tree x l y else tree y r tree x l tree x l y 之後再考慮轉移,對於這個題來說...

題目 stupid 愚蠢的礦工

背景stupid 家族得知在hyc家的後花園裡的 花壇處,向北走3步,向西走3步,再向北走3步,向東走3步,再向北走6步,向東走3步,向南走12步,再向西走2步 就能找到寶藏的入口,而且寶藏都是藏在山里的,必須挖出來,於是stupid家族派狗狗帶領礦工隊去挖寶藏.hyc家的寶藏被狗狗挖走後有什麼感想...

愚蠢的礦工 樹形動態規劃

一 思路 題目是多叉樹,原本想 0 0 0 3 0 1 2 0 2 1 0 3 1 但是要列舉的情況太多,就採用轉換為二叉樹的方法 1 2 3 1 讀進多叉樹tree 1001 1001 tree i 0 來記錄本節點的孩子個數 tree i j 表示節點i的第j個子節點的編號 2 轉化為二叉樹bi...