diff --git a/src/8/29/P2014.cpp b/src/8/29/P2014.cpp new file mode 100644 index 0000000..9939882 --- /dev/null +++ b/src/8/29/P2014.cpp @@ -0,0 +1,55 @@ +/* + +dp[i][j]=修第i个课程时(以i为根),总共选修了j门课程学习的最大学分是多少 + +dp[u][j]=max( + dp[u][j], + dp[v][1~j-1]+v[u] +) + +*/ + +#include +#include +#include +#include +#include +using ll = int64_t; + +ll n,m; +std::vector f,val; +std::vector> dp; +std::vector> edg; + +static inline void dfs(const ll u){ + dp[u][1]=val[u]; + for(auto v:edg[u]){ + dfs(v); + for(ll i=m;i>=1;--i){ + for(ll j=i-1;j>=1;--j){ + dp[u][i]=std::max( + dp[u][i], + dp[v][j]+dp[u][i-j] + ); + } + } + } +} + +int main(){ + std::iostream::sync_with_stdio(false); + std::cin.tie(nullptr); + + std::cin>>n>>m; + ++m; + f.resize(n+1); + val.resize(n+1); + dp.resize(n+1,std::vector(m+1)); + edg.resize(n+1); + for(ll i=1;i<=n;++i){ + std::cin>>f[i]>>val[i]; + edg[f[i]].push_back(i); + } + dfs(0); + std::cout<