DP 樹型專題二

2021-09-26 03:05:34 字數 1552 閱讀 5683

dp[

cur]

[j]=

max(

dp[c

ur][

j],d

p[cu

r][j

−k]+

dp[t

o][k

])

dp[cur][j] = max(dp[cur][j], dp[cur][j-k]+dp[to][k])

dp[cur

][j]

=max

(dp[

cur]

[j],

dp[c

ur][

j−k]

+dp[

to][

k])給子樹to分 k 節課 + 以cur為根節點且僅有j - k節課的最優情況

存疑: 為啥能保證dp[cur][j-k]的最最優情況是建立在沒有分給to課程一節課的基礎上?

#include

#include

#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)

#define _rev(i, a, b) for (int i = (a); i >= (b); --i)

#define _for(i, a, b) for (int i = (a); i < (b); ++i)

#define _rof(i, a, b) for (int i = (a); i > (b); --i)

#define ll long long

#define db double

#define oo 0x3f3f3f3f

#define eps 0.00001

#define all(x) x.begin(), x.end()

#define met(a, b) memset(a, b, sizeof(a))

#define id(x) ((x + 8))

#define bin(x) cerr << #x << " is " << bitset<15>(x) << endl

#define what_is(x) cerr << #x << " is " << x << endl

#define lowbit(x) x &(-x)

using

namespace std;

const

int maxn =

310;

int cnt, head[maxn]

, n, m, dp[maxn]

[maxn]

, cla[maxn]

;struct node

way[

2* maxn]

;void

addedge

(int from,

int to)

void

dfs(

int cur)}}

}signed

main()

dfs(0)

; cout << dp[0]

[m +1]

<< endl;

}

樹型DP入門

題意 某公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司,現在已知每個人的活躍指數和上司關係 當然不可能存在環 求邀請哪些人 多少人 來能使得晚會的總活躍指數最大。思路 任何乙個點的取捨可以看作一種決策,那麼狀態就是在某個點取的時候或者不取的時候,...

樹型DP 選課

大學裡實行學分。每門課程都有一定的學分,學生只要選修了這門課並考核通過就能獲得相應的學分。學生最後的學分是他選修的各門課的學分的總和。每個學生都要選擇規定數量的課程。其中有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如,資料結構 必須在選修了 高階語言...

加分二叉樹 樹型DP

題目 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第j個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subt...