【hdu 1011】Starship Troopers 树形dp
2016-10-22 11:32
387 查看
4000
树形依赖背包,转移必须是三维,郁闷的是居然写了那么久,因为每一个点即是没有bug还是要一个人去对吧?k必须从1开始,从0开始会wa,而且根必须是1,好扯淡啊
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 105
using namespace std;
int f[maxn][maxn],n,m,tot,head[3*maxn],w[maxn],ned[maxn],is_rt[maxn];
struct edge{
int v,next;
}e[maxn*3];
void adde(int a,int b){e[tot].v=b,e[tot].next=head[a];head[a]=tot++;}
void dfs(int u,int fa){
int x=ned[u],y=w[u];
for(int i=x;i<=m;i++)f[u][i]=y;
for(int i=head[u];~i;i=e[i].next)if(e[i].v!=fa)dfs(e[i].v,u);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].v;if(v==fa)continue;
for(int j=m;j>=x;j--){
for(int k=j-ned[u];k>=1;k--){
f[u][j]=max(f[u][j],f[v][k]+f[u][j-k]);
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)&&(~n)&&~m){
memset(head,-1,sizeof(head));memset(f,0,sizeof(f)),tot=0;
for(int i=1;i<=n;i++){
scanf("%d%d",ned+i,w+i);
ned[i]=(ned[i]+19)/20;
}
for(int a,b,i=1;i<n;i++){
scanf("%d%d",&a,&b);
adde(a,b);adde(b,a);
}
if(!m){
printf("0\n");continue;
}
dfs(1,1);
printf("%d\n",f[1][m]);
}
return 0;
}
树形依赖背包,转移必须是三维,郁闷的是居然写了那么久,因为每一个点即是没有bug还是要一个人去对吧?k必须从1开始,从0开始会wa,而且根必须是1,好扯淡啊
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 105
using namespace std;
int f[maxn][maxn],n,m,tot,head[3*maxn],w[maxn],ned[maxn],is_rt[maxn];
struct edge{
int v,next;
}e[maxn*3];
void adde(int a,int b){e[tot].v=b,e[tot].next=head[a];head[a]=tot++;}
void dfs(int u,int fa){
int x=ned[u],y=w[u];
for(int i=x;i<=m;i++)f[u][i]=y;
for(int i=head[u];~i;i=e[i].next)if(e[i].v!=fa)dfs(e[i].v,u);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].v;if(v==fa)continue;
for(int j=m;j>=x;j--){
for(int k=j-ned[u];k>=1;k--){
f[u][j]=max(f[u][j],f[v][k]+f[u][j-k]);
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)&&(~n)&&~m){
memset(head,-1,sizeof(head));memset(f,0,sizeof(f)),tot=0;
for(int i=1;i<=n;i++){
scanf("%d%d",ned+i,w+i);
ned[i]=(ned[i]+19)/20;
}
for(int a,b,i=1;i<n;i++){
scanf("%d%d",&a,&b);
adde(a,b);adde(b,a);
}
if(!m){
printf("0\n");continue;
}
dfs(1,1);
printf("%d\n",f[1][m]);
}
return 0;
}
相关文章推荐
- hdu-1011- Starship Troopers-自由树转二叉树+树形DP
- HDU 1011 Starship Troopers(树形dp)
- HDU 1011 Starship Troopers (树形DP)
- hdu 1011 Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形dp)
- hdu 1011 Starship Troopers 树形dp
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu 1011 Starship Troopers (依赖背包 树形dp)
- hdu 1011 Starship Troopers(树形DP)
- HDU 1011 - Starship Troopers (树形DP)
- hdu 1011(树形dp)Starship Troopers
- hdu 1011 Starship Troopers 树形dp
- HDU 1011 Starship Troopers---树形dp+有依赖的背包
- hdu 1011 Starship Troopers (树形背包dp)
- hdu 1011 Starship Troopers(树形DP)
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- hdu 1011 Starship Troopers 树形dp
- hdu 1011 Starship Troopers (树形背包dp)