我是靠谱客的博主 魁梧刺猬,这篇文章主要介绍P1273 有线电视网(树形dp),现在分享给大家,希望可以做个参考。

https://www.luogu.com.cn/problem/P1273


思路:

dp[i][j]:以i为根的子树服务j个用户的最大收益。

答案遍历到dp[i][j]>=0的时候更新最值

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<<a<<endl; using namespace std; const int maxn=3e3+100; typedef long long LL; inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f;} LL val[maxn],out[maxn],siz[maxn]; struct Edge{ LL to,cost; }; vector<Edge>g[maxn]; LL dp[maxn][maxn]; void dfs(LL u,LL fa){ siz[u]=1; dp[u][0]=0; if(out[u]==0) dp[u][1]=val[u];///叶子的价值初始化 for(LL i=0;i<g[u].size();i++){ LL v=g[u][i].to;LL cost=g[u][i].cost; if(v==fa) continue; dfs(v,u); siz[u]+=siz[v]; for(LL j=siz[u];j>=1;j--){ for(LL k=1;k<=j;k++){ dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-cost); } } } } int main(void){ cin.tie(0);std::ios::sync_with_stdio(false); LL n,m;cin>>n>>m; for(LL i=1;i<=n-m;i++){ LL k;cin>>k; for(LL j=1;j<=k;j++){ LL v,cost;cin>>v>>cost; g[i].push_back({v,cost});out[i]++; g[v].push_back({i,cost}); } } for(LL i=1;i<=n;i++){ if(out[i]==0){ cin>>val[i]; } } memset(dp,-0x3f,sizeof(dp)); dfs(1,-1); LL ans=0; for(LL j=1;j<=n;j++){ if(dp[1][j]>=0){ ans=max(ans,j); } } cout<<ans<<"n"; return 0; }

 

最后

以上就是魁梧刺猬最近收集整理的关于P1273 有线电视网(树形dp)的全部内容,更多相关P1273内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部