DP Intro - poj 1947 Rebuilding Roads
算法:
dp[i][j]表示以i为根的子树要变成有j个节点的状态需要减掉的边数。
考虑状态转移的时候不考虑i的父亲节点,就当不存在。最后统计最少减去边数的
时候+1。
考虑一个节点时,有两种选择,要么剪掉跟子节点相连的边,则dp[i][j] = dp[i][j]+1;
要么不剪掉,则d[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]);
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<vector>
- using namespace std;
- vector<int> v[160];
- int dp[160][160],fa[160],p,n;
- int minn(int a,int b)
- {
- return a<b?a:b;
- }
- void dfs(int r,int pre)
- {
- int s = v[r].size();
- dp[r][1]=0;
- for(int k=0;k<s;k++)
- {
- int to=v[r][k];
- if(to==pre) continue;
- dfs(to,r);
- for(int i=p;i>=0;i--)
- {
- int tmp=dp[r][i]+1;
- for(int j=1;j<i;j++)
- tmp=minn(tmp,dp[r][j]+dp[to][i-j]);
- dp[r][i]=tmp;
- }
- }
- }
- int main()
- {
- int a,b,root;
- while(scanf("%d%d",&n,&p)!=EOF)
- {
- memset(dp,0x3f,sizeof(dp));
- memset(fa,0,sizeof(fa));
- for(int i=0;i<n-1;i++)
- {
- scanf("%d%d",&a,&b);
- v[a].push_back(b);
- fa[b]=a;
- }
- for(int i=1;i<=n;i++)
- {
- if(!fa[i])
- {
- root=i;
- break;
- }
- }
- dfs(root,-1);
- int ans=dp[root][p];
- for(int i=1;i<=n;i++)
- ans=minn(dp[i][p]+1,ans);
- printf("%d\n",ans);
- }
- return 0;
- }
DP Intro - poj 1947 Rebuilding Roads的更多相关文章
- DP Intro - poj 1947 Rebuilding Roads(树形DP)
版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- 树形dp(poj 1947 Rebuilding Roads )
题意: 有n个点组成一棵树,问至少要删除多少条边才能获得一棵有p个结点的子树? 思路: 设dp[i][k]为以i为根,生成节点数为k的子树,所需剪掉的边数. dp[i][1] = total(i.so ...
- POJ 1947 Rebuilding Roads 树形DP
Rebuilding Roads Description The cows have reconstructed Farmer John's farm, with its N barns (1 & ...
- POJ 1947 Rebuilding Roads 树形dp 难度:2
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9105 Accepted: 4122 ...
- [poj 1947] Rebuilding Roads 树形DP
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...
- POJ 1947 Rebuilding Roads
树形DP..... Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: ...
- POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...
- POJ 1947 Rebuilding Roads(树形DP)
题目链接 题意 : 给你一棵树,问你至少断掉几条边能够得到有p个点的子树. 思路 : dp[i][j]代表的是以i为根的子树有j个节点.dp[u][i] = dp[u][j]+dp[son][i-j] ...
- POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..
dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t) < i=(1,n) , t = i是否为整棵树的根 > 更新的时 ...
随机推荐
- Hadoop压缩之MapReduce中使用压缩
1.压缩和输入分片 Hadoop中文件是以块的形式存储在各个DataNode节点中,假如有一个文件A要做为输入数据,给MapReduce处理,系统要做的,首先从NameNode中找到文件A存储在哪些D ...
- WordPaster2-Chrome 45安装说明
下载地址:http://www.ncmem.com/download/WordPaster2/WordPaster.exe 安装方法: 运行WordPaster.exe进行安装,WordPaste ...
- 编写高质量代码改善C#程序的157个建议——建议138:事件和委托变量使用动词或形容词短语命名
建议138:事件和委托变量使用动词或形容词短语命名 事件和委托使用场景是调用某个方法,只不过这个方法由调用者赋值.这决定了对应的变量应该以动词或形容词短语命名. 关于事件和委托变量妥当的命名示例如下: ...
- Huawei .V3 Extention audio Play
相关dll下载 链接 using System;using System.IO;using System.Threading;using Alvas.Audio;using NAudio.Wave; ...
- NOIP提高组题目归类+题解摘要(2008-2017)
因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...
- 初学python - 字典
字符串转为字典 import astline=input()linedict=ast.literal_eval(line) 遍历字典 for key in linedict: value=linedi ...
- const 与define 创建符号常量的 用法与区别
一.define 的用法: 在c语言中我经常会看到 :#define PI 12 ,这是创建了一个符号常量,这里面要注意没有那个等于号“=”: 二.const 的用法: 1.const 也可以来创 ...
- Linux下的信号量
首先,什么是信号量? 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识.信号量在此过程中负责操作的互 ...
- Python编程中 re正则表达式模块 介绍与使用教程
Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...
- mysql 快照读MVCC
mysql的读分快照读和当前读 快照读 是指写的同时,读不阻塞,达到并发的作用 这时候的读 是 记录的历史版本,存在于undo里,当然回滚时就的也是这个undo 当执行一条update语句时,记录本身 ...