树形DP习题
听闻noip要考树形DP,本蒟蒻万分惶恐,特刷一坨题目,以慰受惊之心。
codevs 1486
/*和非常出名的“选课”是一个题*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1010
using namespace std;
int son[N][],f[N][N],v[N],n,m,flag;
int dfs(int x,int y)
{
if(f[x][y]!=-)return f[x][y];
if(x==||y<=)
{
if(!flag)flag=;
else return ;
}
f[x][y]=dfs(son[x][],y);
for(int i=;i<=y-;i++)
f[x][y]=max(f[x][y],dfs(son[x][],i)+dfs(son[x][],y--i)+v[x]);
return f[x][y];
}
int main()
{
memset(f,-,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&v[i]);
for(int i=;i<=n;i++)
{
int x,y;scanf("%d%d",&x,&y);
if(!son[x][])son[x][]=y;
else
{
x=son[x][];
while(son[x][])x=son[x][];
son[x][]=y;
}
}
printf("%d",dfs(,m+));
return ;
}
codevs 1163
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 110
using namespace std;
int son[N][],cost[N],val[N],f[N][N*],n,m,p=;
void build(int x)
{
if(val[x])return;
son[x][]=++p;build(p);
son[x][]=++p;build(p);
}
int dfs(int x,int y)
{
if(f[x][y]!=-)return f[x][y];
if(y<=)return ;
if(val[x])return min(val[x],(y/));
int s0=son[x][],s1=son[x][];
f[x][y]=max(dfs(s0,y-cost[s0]),dfs(s1,y-cost[s1]));
for(int i=;i<=y;i++)
f[x][y]=max(f[x][y],dfs(s0,i-cost[s0])+dfs(s1,y-i-cost[s1]));
return f[x][y];
}
int main()
{
memset(f,-,sizeof(f));
scanf("%d",&m);
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
cost[++n]=x*;val[n]=y;
}
build();
printf("%d",dfs(,m-cost[]));
return ;
}
poj 1463
/*
题意:给定一棵树,要求选最少的点,是每条边至少有一个点被选中
f[i][0/1]表示第i个点选或不选的最少花费。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1510
using namespace std;
int head[N],f[N][],n,cnt;
struct node
{
int v,pre;
};node e[N*];
void add(int x,int y)
{
++cnt;
e[cnt].v=y;
e[cnt].pre=head[x];
head[x]=cnt;
}
void dfs(int x,int fa)
{
f[x][]=;
for(int i=head[x];i;i=e[i].pre)
{
if(e[i].v==fa)continue;
dfs(e[i].v,x);
f[x][]+=min(f[e[i].v][],f[e[i].v][]);
f[x][]+=f[e[i].v][];
}
}
int main()
{
freopen("jh.in","r",stdin);
while(scanf("%d",&n)!=EOF)
{
cnt=;
memset(f,,sizeof(f));
memset(e,,sizeof(e));
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
{
int x,y,z;
scanf("%d:(%d) ",&x,&y);
for(int j=;j<=y;j++)
{
scanf("%d",&z);
add(x,z);add(z,x);
}
}
dfs(,-);
printf("%d\n",min(f[][],f[][]));
}
return ;
}
树形DP习题的更多相关文章
- 「算法笔记」树形 DP
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- 原生态js获取节点的方法
<input value="我是用id来获取值的" type="button" onclick="GetById()"/> &l ...
- C语言中free函数是如何确定要释放多少内存空间的
本文链接:http://www.cnblogs.com/xxNote/p/4009359.html 今天看书的时候看到free函数释放动态申请的内存时只需要把内存块的首地址传过去就行了,显然仅仅依靠首 ...
- C#GDI+图像处理
支持格式:BMP.GIF.JPEG.EXIF.PNG.TIFF.ICON.WMF.EMF等,几乎涵盖所有常用格式 图像类: Image类:Bitmap和Metafile的类提供功能的抽象基类. Met ...
- tableview侧滑删除
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { ) { retu ...
- Kali Linux渗透基础知识整理(一):信息搜集
写在前面的废话:最近要给一些新人做培训,整理些东西,算不上什么太高端的内容,只是简单的整理下了,我觉得对于小白的话也还算是干货.在乌云水了几年,算不上什么大神水平,最近生活费紧张,现在打算在FreeB ...
- css选择器(E[att^=”val”]序号选择器)
一.基本选择器序号 选择器 含义1. * 通用元素选择器,匹配任何元素2. E 标签选择器,匹配所有使用E标签的元素3. .info class选择器,匹配所有class属性中包含info的元素4. ...
- 有关在线OJ网络AC爬虫
搜索源码 爬取代码 自动登录 在线提交 判断AC
- ubuntu彻底卸载mysql
1.删除mysql sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt ...
- 转:理解Cookie和Session机制
原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...
- 使用 MongoDB 的_id 查询
MongoDB 默认在插入数据时,生成一个主键_id,那么怎么使用_id来查询数据? 查询全部 > db.foo.find(){ "_id" : ObjectId(" ...