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...