题大意是:给你一棵节点为n的树,问至少砍几刀可以孤立出一棵节点为m的子树。

解题思路:这题很容易想到状态dp[i][j]表示以i节点为根,节点总数为j的子树最少需要切几刀。但是这个状态方程确实很难想,dp[i][j+k]=min{dp[i][j]+dp[son[i]][k]-1,dp[i][j+k]};关键是为什么要减1,因为一开始dp[i][1]=直接子节点数,相当于i节点本身是一个孤立的状态,而dp[i][j]是由dp[i][1]往上推过去的,就相当于i这棵子树把son[i]这个子树给切开了,所以合起来的时候要把这一刀减掉。

这个状态转移方程确实够难想的。

转载:http://blog.csdn.net/balloons2012/article/details/7844871

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 155;
struct Edge
{int to,next;
}edge[maxn];
int n,m,cnt,pre[maxn],num[maxn],dp[maxn][maxn];void addedge(int u,int v)
{edge[cnt].to = v;edge[cnt].next = pre[u];pre[u] = cnt++;
}void dfsDP(int u)
{for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].to;dfsDP(v);for(int j = m; j >= 1; j--)for(int k = 0; j - k >= 0; k++)dp[u][j] = min(dp[u][j],dp[u][j-k] + dp[v][k] - 1);}
}int main()
{int u,v;while(scanf("%d%d",&n,&m)!=EOF){memset(pre,-1,sizeof(pre));memset(dp,0x1f,sizeof(dp));memset(num,0,sizeof(num));cnt = 0;for(int i = 1; i < n; i++){scanf("%d%d",&u,&v);addedge(u,v);num[u]++;}for(int i = 1; i <= n; i++)dp[i][1] = num[i];dfsDP(1);int ans;for(int i = 1; i <= n; i++){if(i == 1) ans = dp[1][m];else ans = min(ans,dp[i][m]+1);}printf("%d\n",ans);}return 0;
}

poj 1947(树形dp+背包问题)相关推荐

  1. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  2. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  3. poj 2342 树形DP

    树形DP入门题目. 树形DP说白了就是在搜索的时候动态规划. 只要你懂的深搜+动态规划,就能理解这个基础题了. 先直接搜索到最底层,然后一层一层动态规划,可以说有点像数塔. dp[i][1],dp[i ...

  4. poj 2486 树形dp

    思路:这题是裸的树形dp.dp[i][j]表示第i个节点花费j步并且从子节点返回,能得到的最大苹果数:nback[i[j]表示第i个节点花费j步并且进入某个子节点不返回,能得到的最大苹果数.那么我们就 ...

  5. poj 2152 树形dp(建立消防站)

    题意:给定n个节点组成的树,树边有权.现在要在一些点上建立消防站,每个点建站都有花费cost[i].如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站.求符合上述条件的最小费用建站方 ...

  6. POJ 2342 (树形DP)

    题目链接: http://poj.org/problem?id=2342 题目大意:直属上司和下属出席聚会.下属的上司出现了,下属就不能参加,反之下属参加.注意上司只是指直属的上司.每个人出席的人都有 ...

  7. poj 3417 树形dp+LCA

    思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...

  8. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...

  9. 【POJ - 1947】Rebuilding Roads (树形dp,背包问题,树形背包dp)

    题干: The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1. ...

最新文章

  1. 不发项目奖金,程序员怒删代码,被判 5 个月!
  2. 足够应付面试的Spring事务源码阅读梳理
  3. vue项目默认IE以最高级别打开
  4. 装饰器中的@functools.wraps的作用
  5. 解决Android SDK更新慢
  6. 关于Javascript框架的神回帖,值得围观
  7. [洛谷P1951]收费站_NOI导刊2009提高(2)
  8. 百米路由器2登陆地址_腾达无线路由器怎么安装,真的不错
  9. centos 6.2 升级后无法启动图形界面
  10. Objective-c编程语言(一):The Objective-C Programming Language:Introduction
  11. 信息内容安全-图像文字识别OCR
  12. 解密顺丰:内部360度监控,创始人王卫穿破牛仔裤见PE
  13. python编写的软件可以申请专利吗_Python爬虫 | 爬取同一公司用不同名字申请专利的那些Assignees...
  14. Oracle存储过程基本语法 存储过程
  15. Python web开发框架—— Pyramid学习(一)
  16. 前端微信小程序资讯类仿今日头条微信小程序
  17. M1 ErrorCode
  18. docker registry v2认证备忘
  19. Juniper 防火墙的MIP/VIP/DIP
  20. React 基础-创建元素

热门文章

  1. 神策数据杨宁:财富管理转型趋势下的精细化运营
  2. Node.Js从零开始搭建数据管理后台 (一)
  3. Sass--@-Rules
  4. Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
  5. 最长下降/上升子序列问题
  6. 【动态顺序表】 c语言的动态顺序表
  7. rsync 相关参数
  8. [转]Windows的批处理脚本
  9. BlazeDS 整合 Flex HelloWorld 示例
  10. 何洁音乐会今晚开唱 大手笔打造pure show