题目链接:http://poj.org/problem?id=1155

题目大意:电视台要广播电视节目,要经过中转机构,到观众。从电视台到中转商到观众是一个树形结构,经过一条边需要支付成本。现在给你每两个节点之间传播的成本,给你每个观众会付的钱,问你电视台在不亏本的情况下最多能给多少个观众看节目。

这是我的第一道树形dp。。无耻的看了题解。。

设计状态:dp[u][i]代表以u为根的子树中有i个观众,能够得到的最大收入。

状态转移:dp[u][i] = max(dp[u][i],dp[u][i-j]+dp[v][j]-cost[u][v]);

用java写了一个版本。。总是RE,就不知道是为什么了。。

代码:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int MAX_N = ;
  9. const int INF = ;
  10. struct EDGE{
  11. int to,cost;
  12. int next;
  13. };
  14. EDGE edge[MAX_N<<];
  15. int ptr,head[MAX_N];
  16. int cost[MAX_N];
  17.  
  18. void init(){
  19. memset(edge,-,sizeof(edge));
  20. memset(head,-,sizeof(head));
  21. ptr = ;
  22. }
  23.  
  24. void add_edge(int from,int to,int cost){
  25. edge[ptr].to = to;
  26. edge[ptr].cost = cost;
  27. edge[ptr].next = head[from];
  28. head[from] = ptr++;
  29. }
  30.  
  31. int N,M;
  32. int dp[MAX_N][MAX_N];
  33. bool vis[MAX_N];
  34. int sum[MAX_N];
  35.  
  36. void DP(int u){
  37. if( vis[u] ) return;
  38. vis[u] = true; dp[u][] = ;
  39. int tot = ;
  40.  
  41. for(int i=head[u];~i;i=edge[i].next){
  42. int v = edge[i].to;
  43. if( !vis[v] ){
  44. tot++;
  45. DP( v );
  46. sum[u] += sum[v];
  47. }
  48. }
  49.  
  50. if( tot== ){
  51. sum[u] = ;
  52. dp[u][] = cost[u];
  53. } else {
  54. for(int k=head[u];~k;k=edge[k].next){
  55. int v = edge[k].to;
  56. for(int j=sum[u];j>=;--j){
  57. for(int i=;i<=sum[v];i++){
  58. if( j>=i && dp[u][j-i]!=-INF && dp[v][i]!=-INF){
  59. dp[u][j] = max(dp[u][j],dp[u][j-i]+dp[v][i]-edge[k].cost);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. }
  66.  
  67. int main(){
  68. while(scanf("%d%d",&N,&M)!=EOF){
  69. init();
  70. int k;
  71. for(int i=;i<=N-M;i++){
  72. scanf("%d",&k);
  73. for(int j=;j<k;j++){
  74. int a,c;
  75. scanf("%d%d",&a,&c);
  76. add_edge(i,a,c);
  77. add_edge(a,i,c);
  78. }
  79. }
  80.  
  81. for(int i=N-M+;i<=N;i++){
  82. scanf("%d",&cost[i]);
  83. }
  84.  
  85. memset(vis,,sizeof(vis));
  86. memset(sum,,sizeof(sum));
  87. for(int i=;i<=N;i++){
  88. for(int j=;j<=N;j++){
  89. dp[i][j] = -INF;
  90. }
  91. }
  92. DP();
  93. for(int i=N;i>=;--i){
  94. if( dp[][i] >= ) {
  95. printf("%d\n",i);
  96. break;
  97. }
  98. }
  99.  
  100. }
  101. return ;
  102. }

[POJ 1155] TELE (树形dp)的更多相关文章

  1. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  2. Apple Tree POJ - 2486 (树形dp)

    题目链接: D - 树形dp  POJ - 2486 题目大意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 学习网址:https://blog.c ...

  3. Anniversary party POJ - 2342 (树形DP)

    题目链接:  POJ - 2342 题目大意:给你n个人,然后每个人的重要性,以及两个人之间的附属关系,当上属选择的时候,他的下属不能选择,只要是两个人不互相冲突即可.然后问你以最高领导为起始点的关系 ...

  4. POJ 3107.Godfather 树形dp

    Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7536   Accepted: 2659 Descrip ...

  5. POJ 3342 (树形DP)

    题意 :给出一些上下级关系,要求i和i的直接上级不能同时出现,现在选出一些人构成一个集合,问你这个集合里面的最大人数是都少,同时给出这个最大的人数的集合是否唯一. 思路:树形DP,dp[i][0],表 ...

  6. POJ 2342 (树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3863   Accepted: 2172 ...

  7. POJ Anniversary party 树形DP

    /* 树形dp: 给一颗树,要求一组节点,节点之间没有父子关系,并且使得所有的节点的权值和最大 对于每一个节点,我们有两种状态 dp[i][0]表示不选择节点i,以节点i为根的子树所能形成的节点集所能 ...

  8. poj 1155 TELE(树形DP)

    TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4863   Accepted: 2673 Description ...

  9. poj 1155 TELE (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...

随机推荐

  1. ExpandableListView方法详解

    正文 一.结构public interface ExpandableListAdapter 间接子类:BaseExpandableListAdapter,CursorTreeAdapter,Resou ...

  2. Jfinal连接自助数据库的数据源

    # 开发数据库地址 #jdbcUrl = jdbc:oracle:thin:@localhost:1521:testsa jdbcUrl = jdbc:srdbsql://127.0.0.1:1975 ...

  3. java.io.IOException: ORA-22920: 未锁定含有 LOB 值的行

         究其原因是因为没有锁定要更新的行记录.将 mysql="select filebody from filelist where filename=?"中的SQL语句加上 ...

  4. Linux下编译Boost

    编译环境 操作系统: Red Hat Enterprise Linux Server release 5.4 64-bit 编译工具: gcc (GCC) 4.1.2 20080704 (Red Ha ...

  5. iMac一体机安装苹果和Win7双系统

    前几天,有个客户说有一苹果的一体机,想装苹果和Win7双系统.约好了时间,带上工具就过去了.去的路上,用手机上网查了一下苹果电脑装双系统的过程.虽然以前也有给苹果的电脑安装过双系统,但次数不多而且时间 ...

  6. erlang接入远程shell

    两种方式 erl -name aaa@127.0.0.1 -setcookie erl -name bbb@127.0.0.1 -setcookie ctrl + g进入jcl模式 h查看帮助 r ' ...

  7. FTP搭建

    在桌面上右击“我的电脑”,执行“管理”命令,在“计算机管理”窗口的左窗格中依次展开“系统工具 ”→“本地用户和组”目录,单击选中“用户”选项.在右侧窗格中单击右键,执行“新用户”命令.在 打开的“新用 ...

  8. u-boot启动流程分析(2)_板级(board)部分

    转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...

  9. js工具类 ----正则

    function(value){  if(value){   var reg=new RegExp("^[a-zA-Z0-9_-]+$");   return reg.test(v ...

  10. sbt设置

    配置中央仓库 vim ~/.sbt/repositories [repositories] local osc: http://maven.oschina.net/content/groups/pub ...