hdu 1011 树形dp+背包
2024-10-18 22:27:42
题意:有n个房间结构可看成一棵树,有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间有一定的敌人,每个士兵可以对抗20个敌人,士兵在某个房间对抗敌人使无法走开,同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少
链接:点我
分析:树形dp,对于点u,dp[u][j]表示以u为根的树消耗j个士兵得到的最大值,dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son][k]+val[u])
注意是无向图,vis位置不能随便放,且注意dp不能直接+val,因为这样根节点就加不到val了
虽然方程很快就想出来了,真写起来wa点还是很多的
第二次做
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int n,m,tt;
int aa[MAXN];
int tot,head[MAXN],dp[MAXN][MAXN],in[MAXN];
int bug[MAXN],val[MAXN],vis[MAXN];
struct Edge
{
int to,next;
}edge[MAXN<<];
void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int u)
{
vis[u]=;
int num=(bug[u]+)/;
for(int i=num;i<=m;i++) dp[u][i]=val[u];
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]) continue;
dfs(v);
for(int j=m;j>=num;j--)
{
for(int k=;j-k>=num;k++) //派k人攻打其他地方
{
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
}
void init()
{
tot=;
memset(head,-,sizeof(head));
cl(dp);
cl(vis);
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==-&&m==-) break;
init();
for(i=;i<=n;i++)
{
scanf("%d%d",&bug[i],&val[i]);
}
int u,v;
for(i=;i<=n-;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
if(m==)
{
printf("0\n");
continue;
}
dfs();
printf("%d\n",dp[][m]);
}
}
最新文章
- Linux C编程学习之C语言简介---预处理、宏、文件包含……
- LSD-SLAM深入学习(1)-基本介绍与ros下的安装
- 怎么简单获取input file 选中的图片,并在一个div的img里面赋值src实现预览?
- LINUX yum用法
- Octopus系列之SQLite3常用命令
- android关于installLocation
- solr 3.5 配置及server设置
- rails总结
- myeclipse自动生成注释
- REDGATE又一好用的脚本工具ScriptsManager1.3
- poj 2182 Lost Cows(段树精英赛的冠军)
- vue爬坑:把对象中的数据给了某个变量,改变一个对象的值,另一个对象也变化
- 上传文件代码报错,java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
- PAT L2-020 功夫传人
- PDF如何设置书签,怎么在PDF上添加书签
- Java的各种打包方式
- 算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
- 加密算法(扩展知识:Base64编码)
- iframe跨域与session失效问题
- Minix2.0操作系统公用头文件说明