POJ 1155 TELE 树形DP
题目大意:给定一个n个节点的树,1是信号发射塔,1到n-m是中继发射塔,n-m+1 到n是用户,每个用户都会交钱,任意两个节点传输信号都是需要钱的,每个用户最多上交的钱已给定,问在不亏本的情况下,最多有多少用户。
初看题目,研究了下样例,发现每个用户上交的钱在满足自身需求同时还有可能用到其他线路上。
所以我一开始的DP方法是这样打算的,记录下所有用户上交的总钱数 sum,用dp[rt][j]表示以rt为根的树,在分配了j这么多钱之后,最多能有几个用户,写着写着发现不对劲,这样是初始就认为有sum的钱,然后把sum的钱统一分配,明显错了,因为能收到用户的钱,前提是一定要接通它这条线路,。。又试想了改进方法,还是有点问题的样子
后来博客了下,找到另一种dp思想,dp[rt][j],是指在rt为根的树,有j个点联通的最大盈余,初始状态,所有点的dp信息都设置为-INF,除了叶子节点(即用户),用户会上交钱,而且叶子下面没有树了,开销为0,故叶子的值dp[rt][1]即他们上交的钱,接下来就是简单的DP了,枚举dp[rt][j]=max(原值,dp[rt][j-w]+dp[nx][w]-联通代价);
坑爹的是这个题卡时间卡得超级变态啊。。。简直变态啊!!我用vector超时,那就算了,我能理解,换了邻接链表依然超时,TM,原来在遍历的时候,要记录好各个点的子节点的量,只枚举这部分才会不超时。。即便AC的,时间也跑了250MS。简直卡时间变态啊,从头开始枚举都不行。。。我刚查了下POJ的status,有大神0ms还有15ms过得。。。。我简直被打击了啊啊啊啊啊
#include <iostream> #include <cstdio> #include <cstring> #define N 3010 struct node{int v;int next; } e[N]; int lists[N]; int G[N][N];//记录每两个节点的联通代价 int val[N]; int dp[N][N]; int n,m; int cnt; int sum[N]; void dfs(int rt) {sum[rt]=1;dp[rt][0]=0;int i,j;for (i=lists[rt];i!=-1;){int nx=e[i].v;i=e[i].next;dfs(nx);sum[rt]+=sum[nx];for (j=sum[rt];j>=1;j--){for (int w=1;w<=sum[nx]&&w<=j;w++) {if (dp[rt][j]<dp[rt][j-w]+dp[nx][w]-G[rt][nx])dp[rt][j]=dp[rt][j-w]+dp[nx][w]-G[rt][nx];}}} } void add(int a,int b) {e[cnt].v=b;e[cnt].next=lists[a];lists[a]=cnt++; } int main() {while (scanf("%d%d",&n,&m)!=EOF){cnt=0;memset(lists,-1,sizeof lists);int i,j,k;for (i=1;i<=n-m;i++){scanf("%d",&j);for (k=1;k<=j;k++){int a,b;scanf("%d%d",&a,&b);G[i][a]=b;add(i,a);}}for (i=0;i<=n;i++){for (j=0;j<=n;j++)dp[i][j]=-10000000;}for (i=n-m+1;i<=n;i++){scanf("%d",&val[i]);dp[i][1]=val[i];}dfs(1);for (i=n;i>=0;i--){if (dp[1][i]>=0){//只有大于0说明这种i方案可行,输出printf("%d\n",i);break;}}}return 0; }
转载于:https://www.cnblogs.com/kkrisen/p/3409546.html
POJ 1155 TELE 树形DP相关推荐
- POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...
- Tree Cutting POJ - 2378(树形DP)
题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2. 分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根 ...
- poj 1155 TELE
题目描述:... 解法: 树形dp+分组背包. dp[i][j]记录以i为根的子树分配j个用户时的最大收益,cnt[i]记录以i为根的子树有几个叶子节点,对于每个i,背包容量即为cnt[i]的大小. ...
- The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))
思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...
- POJ 2152 Fire(树形DP)
题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... 1 #include<algorithm> 2 # ...
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- POJ 1155 TELE【树形DP】
POJ 1155 TELE http://poj.org/problem?id=1155 大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端, 其余点为转发站.客户端i ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- POJ 2342 | HDU 1520 Anniversary party 树形DP(入门题)
传送门:POJ 2342 题目大意: 有若干人参加一个聚会,如果两个人之间有直接的上下属关系,则只能去一个.每个人都有个高兴值,问高兴值之和最大是多少? 思路: 之前一直觉得树形DP比较难,现在发现树 ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
最新文章
- SelectBox插件
- contains与compareDocumentPosition方法详解
- [20190401]跟踪dbms_lock.sleep调用.txt
- get方式乱码及MAC异常
- 迷宫(洛谷-P1605)
- dlp型3d打印机_【论文新萃】光聚合成型3D打印技术复制印章研究
- javascript 时间类型 Date
- 腾讯 WXG | 技术研究-NLP算法三面复盘
- Mac苹果电脑Matlab2018a和2020a下载及安装(linux和win也有,但是没试)
- 经典配分函数公式以及量子统计形式
- angular6添加子路由_如何将Ionicons添加到Angular 6应用
- 使用 FireDAC的 TFDConnection, TFDQuery 最初只能显示50条记录,TDateSet.RecordCount总是获得50的解决方法。
- 拼多多模式,砍价免费拿商品算法
- hdu2859 Phalanx(线性dp)
- 对郭天祥老师的一些知识点的解读
- 一分钟了解Mysql的间隙锁——《深究Mysql锁》
- 仿网易新闻的首页+QQ的侧滑菜单栏
- Python编程与其他编程语言相比有何优势?
- 计算机bios设置翻译,电脑BIOS全文翻译,做系统设置对照翻译,玩转U盘安装系统!...
- 个人对专注力的一点看法