POJ1155 TELE(树DP)
来源:互联网 发布:菏泽陈集山药淘宝 编辑:程序博客网 时间:2024/05/17 04:32
题目:
poj.org/problem?id=1155
题意:
有N个节点的一棵树,上面前n-m个节点是信号站,后m个节点是用户,每个节点之间传输有消耗,每个用户有费用,总信号从1节点传输出来,求在不赔本的情况下能够最多传输给多少个用户。
思路:
明显是树DP,考虑3000个节点,dp[i][j]就是第i个节点在传输给j个用户的情况下的最小花费是多少,记录每个节点取得的可能最大用户数目,然后对于每个子节点暴力枚举更新就行了,最后1节点时花费为非正的最大的用户数就是答案。
注意每次更新一个节点的子节点时要把当前DP值储存下来用于更新,否则枚举不同数目时可能会重复。
代码:
//kopyh#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define MOD 1000000007#define N 3001using namespace std;int n,m,sum,res,flag;int dp[N][N],val[N],num[N],vis[N],tmp[N];vector<int>g[N],f[N];void dfs(int now){ dp[now][0] = 0; if(val[now]>=0)dp[now][1] = -val[now], num[now]=1; for(int i=0;i<g[now].size();i++) { int y=g[now][i]; dfs(y); for(int j=0;j<=num[now];j++)tmp[j]=dp[now][j]; for(int j=0;j<=num[now];j++) for(int k=0;k<=num[y];k++) dp[now][j+k] = min(dp[now][j+k],tmp[j]+dp[y][k]+f[now][i]); num[now]+=num[y]; }}int main(){ int i,j,k,cas,T,t,x,y,z; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++)g[i].clear(),f[i].clear(); for(i=1;i<=n-m;i++) { scanf("%d",&t); while(t--) { scanf("%d%d",&x,&y); g[i].push_back(x); f[i].push_back(y); } } memset(val,-1,sizeof(val)); memset(num,0,sizeof(num)); memset(dp,0x3f,sizeof(dp)); for(i=n-m+1;i<=n;i++) scanf("%d",&val[i]); dfs(1); for(i=m;i>=0;i--) if(dp[1][i]<=0) break; printf("%d\n",i); } return 0;}
0 0
- POJ1155 TELE(树DP)
- POJ1155:TELE(树形DP)
- poj1155 TELE 【树形dp】
- poj1155 TELE(树形dp)
- POJ1155 TELE(树形DP)
- [POJ1155]TELE(树形dp)
- POJ1155 TELE【树形dp(背包)】
- [POJ1155]TELE(树形dp)
- POJ1155---TELE(树形dp,背包)
- poj1155 TELE(树形dp+背包)
- poj1155 TELE(树形+背包dp)
- [poj1155] TELE 树形DP 01背包
- poj1155 TELE
- POJ1155 TELE
- poj1155 TELE
- 【DP】poj1155
- poj1155 (树形dp)
- poj1155之树形DP
- to distance
- NoHttp使用总结
- CollapsingToolbarLayout 介绍和简单使用
- OpenNI优化,发布精简
- CI框架表单验证
- POJ1155 TELE(树DP)
- 移动无线测试技能树-转载
- 常用框架
- Hive安装
- 字符串类型转化成数值类
- Python练习1
- Android之EventBus初体验
- 豆瓣的混合开发框架 -- Rexxar
- Java设计模式学习05——适配器模式