Loading docs/dp/tree.md +24 −27 Original line number Diff line number Diff line Loading @@ -94,31 +94,28 @@ $$ ??? note "参考代码" ```cpp #include <algorithm> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int f[305][305], s[305], n, m; vector<int> e[305]; int dfs(int u) { int dfs(int u) { int p = 1; f[u][1] = s[u]; for(auto v:e[u]) { for (auto v : e[u]) { int siz = dfs(v); for (int i = min(p, m + 1); i; i--) // 只考虑已经合并过的子树 for(int j=1;j<=siz&&i+j<=m+1;j++)// 选的课程数超过 m+1 的状态没有意义 for (int j = 1; j <= siz && i + j <= m + 1; j++) // 选的课程数超过 m+1 的状态没有意义 f[u][i + j] = max(f[u][i + j], f[u][i] + f[v][j]); p += siz; } return p; } int main() { int main() { scanf("%d%d", &n, &m); for(int i=1;i<=n;i++) { for (int i = 1; i <= n; i++) { int k; scanf("%d%d", &k, &s[i]); e[k].push_back(i); Loading Loading
docs/dp/tree.md +24 −27 Original line number Diff line number Diff line Loading @@ -94,31 +94,28 @@ $$ ??? note "参考代码" ```cpp #include <algorithm> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int f[305][305], s[305], n, m; vector<int> e[305]; int dfs(int u) { int dfs(int u) { int p = 1; f[u][1] = s[u]; for(auto v:e[u]) { for (auto v : e[u]) { int siz = dfs(v); for (int i = min(p, m + 1); i; i--) // 只考虑已经合并过的子树 for(int j=1;j<=siz&&i+j<=m+1;j++)// 选的课程数超过 m+1 的状态没有意义 for (int j = 1; j <= siz && i + j <= m + 1; j++) // 选的课程数超过 m+1 的状态没有意义 f[u][i + j] = max(f[u][i + j], f[u][i] + f[v][j]); p += siz; } return p; } int main() { int main() { scanf("%d%d", &n, &m); for(int i=1;i<=n;i++) { for (int i = 1; i <= n; i++) { int k; scanf("%d%d", &k, &s[i]); e[k].push_back(i); Loading