1. 程式人生 > >73: luogu 2014 樹形dp

73: luogu 2014 樹形dp

++ div style c++ 學生 學分 turn 之前 其它

$des$

在大學裏每個學生,為了達到一定的學分,必須從很多課程裏選擇一些課程來學習,在課程裏有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有N門功課,每門課有個學分,每門課有一門或沒有直接先修課(若課程a是課程b的先修課即只有學完了課程a,才能學習課程b)。一個學生要從這些課程裏選擇M門課程學習,問他能獲得的最大學分是多少?

$des$

建出完整的樹後 dp

#include <bits/stdc++.h>

using namespace std;

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

const
int N = 305; int fa[N]; vector <int> G[N]; int n, q; int w[N]; int f[N][N]; void Dfs(int u) { int S = G[u].size(); Rep(i, 0, S - 1) { int v = G[u][i]; Dfs(v); for(int j = q + 1; j >= 1; j --) { for(int k = 0; k < j; k ++) { f[u][j]
= max(f[u][j], f[v][k] + f[u][j - k]); } } } } int main() { cin >> n >> q; Rep(i, 1, n) { cin >> fa[i] >> w[i]; f[i][1] = w[i]; G[fa[i]].push_back(i); } Dfs(0); cout << f[0][q + 1];
return 0; }

73: luogu 2014 樹形dp