From 5e23f171330bbdf6cd9edf72db584f717933365b Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Fri, 29 Aug 2025 15:59:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0P2014=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现基于树形动态规划的课程选修问题解决方案,计算在限定课程数量下能获得的最大学分。使用深度优先搜索遍历课程依赖关系,并通过动态规划状态转移求解最优解。 --- src/8/29/P2014.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/8/29/P2014.cpp 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<