POJ 1155 TELE 树形dp + 背包
2017-10-28 15:50
288 查看
题目链接
http://poj.org/problem?id=1155题意
一个信号传输网络是树形的。m个潜在用户,n-m个信号发射站。其中1号是电视台信号发电站。每个发射站之间连通需要一定的花费。用户都处在叶子节点处。且每个用户都会给定量的前补偿电视台。在使电视台不亏本的情况下,最多可以使多少用户连同。思路
树形dp+分组背包用dp[u][j] 表示在u的子树中连同j个用户所能获得的最大价值
如果u是叶子节点dp[u][1] = w[u]
如果是普通结点 dp[u][j] = max(dp[u][j],dp[u][j-k] + d[v][k] - w(u,v) ) , 其中v是u的子节点。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<string> #include<queue> #include<stack> #include<set> #include<map> #define ll long long using namespace std; const int INF = ( 2e9 ) + 2; const ll maxn = 3e3+100; struct edge { int v,w,next; }e[maxn*2]; int head[maxn]; int tot; int num[maxn],w[maxn]; int dp[maxn][maxn]; // dp[u][j] : 表示在u的子树中,连接j个客户可获得的最大价值 int n,m; void add(int u,int v,int w) { e[tot].v=v; e[tot].w=w; e[tot].next=head[u]; head[u]=tot++; } void dfs(int u,int fa) { for(int i=1;i<=m;i++) dp[u][i]=-INF; dp[u][0]=0; if(u>=n-m+1) { dp[u][1]=w[u]; return; } for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if(v==fa)continue; dfs(v,u); num[u]+=num[v]; for(int j=num[u];j>=0;j--) for(int k=0;k<=j;k++) dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-e[i].w); } } int main() { while(~scanf("%d%d",&n,&m)) { int k; memset(head,-1,sizeof(head)); tot=0; for(int i=1;i<=n-m;i++) { int v,w; scanf("%d",&k); while(k--) { scanf("%d%d",&v,&w); add(i,v,w); add(v,i,w); } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=-INF; for(int i=n-m+1;i<=n;i++) { scanf("%d",&w[i]); num[i]=1; } dfs(1,-1); int ans=0; for(int i=m;i>=1;i--) if(dp[1][i]>=0) { ans=i;break; } printf("%d\n",ans); } }
相关文章推荐
- poj1155 TELE(树形+背包dp)
- poj 1155 TELE (树形背包dp)
- POJ 1155 TELE 树形DP(0-1背包)
- POJ 1155 TELE 树形DP(背包)
- POJ 1155 TELE (树形DP,树形背包)
- POJ 1155 - TELE 树形DP(泛化背包转移)..
- poj 1155 TELE (树形背包dp)
- poj 1155 TELE 树形dp泛化背包
- POJ1155 TELE【树形dp(背包)】
- POJ 1155 树形背包(DP) TELE
- POJ 1155 TELE 树形DP(0-1背包)
- poj 1155 TELE 树形背包dp
- poj 1155 TELE(树形泛化背包dp)
- poj 1155 TELE (树形dp)
- poj 1155 TELE(树形DP)
- POJ 1155 TELE 树形dp
- POJ 1155 TELE 树形背包
- POJ 1155 TELE 树形dp
- POJ 1155 TELE(树形DP 水)
- POJ 1155 TELE - 树形DP