由电视台,中转站,和用户的电视组成的体系刚好是一棵树

n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root

现在节点1准备转播一场比赛,已知从一个节点传送数据到达另一个节点,电视台需要一定的费用

若可以传送数据到达用户的节点n-m+1~n,这些用户各自愿意支付一定的费用给电视台

现在电视台希望在不亏本的情况下为尽量多的用户转播比赛

输出最多可以为多少用户转播比赛

背包类型的树形DP第一题

dp[i][j]表示以节点i为根的子树有j个用户获得转播,电视台的最大收益

由于收益有正有负

初始化:

dp[i][0]=0

dp[i][j]=-inf(j>0)

目标:dp[1][j]>=0的条件下最大的j

(dp[1][j]>=0表示电视台不亏本)

dfs的过程递推dp

有个主意的地方写在了注释

  1 #include<cstdio>
  2 #include<cstring>
  3
  4 using namespace std;
  5
  6 inline int max(int a,int b)
  7 {
  8     return a>b?a:b;
  9 }
 10
 11 const int maxn=3005;
 12 const int inf=0x3f3f3f3f;
 13
 14 int dp[maxn][maxn];
 15 int cost[maxn][maxn];
 16 int siz[maxn];
 17 struct Edge
 18 {
 19     int to,next;
 20 };
 21 Edge edge[maxn];
 22 int head[maxn];
 23 int tot;
 24 int n,m;
 25
 26 void addedge(int u,int v)
 27 {
 28     edge[tot].to=v;
 29     edge[tot].next=head[u];
 30     head[u]=tot++;
 31 }
 32
 33 void init()
 34 {
 35     memset(head,-1,sizeof head);
 36     tot=0;
 37     for(int i=1;i<=n;i++)
 38     {
 39         dp[i][0]=0;
 40         for(int j=1;j<=m;j++)
 41             dp[i][j]=-inf;
 42     }
 43 }
 44
 45 void solve();
 46 void dfs(int u);
 47
 48 int main()
 49 {
 50     while(~scanf("%d",&n))
 51     {
 52         scanf("%d",&m);
 53         init();
 54         for(int i=1;i<=n-m;i++)
 55         {
 56             int num;
 57             scanf("%d",&num);
 58             while(num--)
 59             {
 60                 int u;
 61                 scanf("%d",&u);
 62                 scanf("%d",&cost[i][u]);
 63                 addedge(i,u);
 64             }
 65         }
 66         for(int i=n-m+1;i<=n;i++)
 67         {
 68             scanf("%d",&cost[i][maxn-1]);
 69         }
 70         solve();
 71     }
 72     return 0;
 73 }
 74
 75 void solve()
 76 {
 77     dfs(1);
 78     for(int j=siz[1];j>=0;j--)
 79     {
 80         if(dp[1][j]>=0)
 81         {
 82             printf("%d\n",j);
 83             return ;
 84         }
 85     }
 86     /*
 87     for(int i=0;i<=siz[1];i++)
 88         printf("%d\n",dp[1][i]);
 89     */
 90 }
 91
 92 void dfs(int u)
 93 {
 94     siz[u]=0;
 95     for(int i=head[u];~i;i=edge[i].next)
 96     {
 97         int v=edge[i].to;
 98         if(n-m<v)
 99         {
100             dp[v][0]=0;
101             dp[v][1]=cost[v][maxn-1];
102             siz[v]=1;
103         }
104         else
105         {
106             dfs(v);
107         }
108         siz[u]+=siz[v];
109
110         //由于更新dp[u][j]的时候
111         //dp[u][j-k]需要表示以u为根的子树,有j-k个是从前面的儿子节点取的
112         //所以这个时候dp[u][j-k]不可以被儿子节点v更新过(保证j-k个都是从前面取的)
113         //所以递推时j要逆推
114         //当然,k和j循环的顺序也就不可以交换了
115         for(int j=siz[u];j>0;j--)
116         {
117             for(int k=1;k<=siz[v];k++)
118                 if(j>=k)
119                     dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-cost[u][v]);
120         }
121     }
122 }

View Code

转载于:https://www.cnblogs.com/-maybe/p/4749155.html

POJ 1155 TELE 背包型树形DP 经典题相关推荐

  1. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  2. poj 1155 TELE

    题目描述:... 解法: 树形dp+分组背包. dp[i][j]记录以i为根的子树分配j个用户时的最大收益,cnt[i]记录以i为根的子树有几个叶子节点,对于每个i,背包容量即为cnt[i]的大小. ...

  3. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  4. 洛谷P1352 没有上司的舞会(树形DP水题)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  5. 树形dp瞎讲+树形dp基础题题解

    ---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...

  6. 树形dp进阶题2 JSOI2018潜入行动

    JSOI2018 潜入行动 题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JY ...

  7. POJ - 3342 Party at Hali-Bula(树形dp)

    题目链接:点击查看 题目大意:n个人参加聚会,每个人都不想和老板一起参加,问最多可以有多少个人参加,并且判断方案唯一性 题目分析:这个类型的题目这已经是第三个了,状态转移方程都一模一样,不过这个题有点 ...

  8. 【POJ - 1664】放苹果 (递归经典题 或 dp 或 母函数)

    题干: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t ...

  9. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)

    [洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...

最新文章

  1. binlog日志的三种模式
  2. Xamarin.Forms项目无法添加服务引用
  3. 马斯克的火箭,这次没!爆!炸!
  4. Android消息处理机制
  5. Android .so和.a的makefile
  6. 瓜子二手车发12月二手车价格:汉兰达奥德赛CR-V保值率居首
  7. 【POJ - 3169】 Layout(差分约束+spfa)(当板子记?)
  8. 【树形dp】vijos1144小胖守皇宫
  9. Vue中全局导入和按需导入的区别
  10. 小程序中canvas绘制网络图片
  11. SLAM_四元数取逆-Quaternion Inverse - 已验证
  12. 如何把PDF锁定,限制修改文档内容?
  13. php mysql新闻表模板_新闻列表之创建数据库
  14. 塔勒布《反脆弱》读后感
  15. 根据价格变化自动识别极值点策略
  16. 百度分享异步加载问题、分页,无效果解决
  17. html怎么用css文件怎么打开,css文件用什么打开?
  18. win7计算机变成英文,我的win7开机选项变成了英文怎么处理
  19. 《猎罪图鉴》中暴露出人脸识别安全隐患,你的脸或许正被仿冒
  20. tinymce富文本编辑器的使用

热门文章

  1. flink背压问题处理(还没弄完)
  2. gensim在“中文查找(关键词)“与“txt文本“之间做相似度计算(返回最相似的文本)
  3. class与case class的区别(转载)
  4. Ubuntu Linux 16.04 xfce下最漂亮的系统字体------文鼎粗钢笔楷体安装记录
  5. windows下mysql中文乱码_windows下mysql中文乱码, 配置解决方法
  6. 网络杂谈, Docker, MongoDB
  7. csv 20位数据 如何打开可以预览完整数字_干货Python Pandas 做数据分析之玩转 Excel 报表分析...
  8. 文件的上传和下载---学习笔记
  9. RT-Flash imxrt 系列rt1052 rt1060量产神器宣传
  10. ios UITableView顶部向下偏移