听闻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习题的更多相关文章

  1. 「算法笔记」树形 DP

    一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...

  2. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  3. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  4. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  5. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  6. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  7. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  8. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  9. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

随机推荐

  1. PHP函数 rtrim() 的一个怪异现象

    今天用rtrim()函数时遇到了一个奇怪的问题: echo rtrim('<p></div>', '</div>'); // 输出为 <p echo ltri ...

  2. C#爬虫之~苏飞万能框架使用教程

    苏飞的框架帮助类,很多人应该都知道,不知道可以百度,此处直接说用法. //引入命名空间 using CsharpHttpHelper; //创建Httphelper对象 HttpHelper http ...

  3. Codeforces Round #292 (Div. 2) C. Drazil and Factorial

    题目链接:http://codeforces.com/contest/515/problem/C 给出一个公式例如:F(135) = 1! * 3! * 5!; 现在给你一个有n位的数字a,让你求这样 ...

  4. 推荐ubuntu下的画图工具

    今天发现ubuntu下面也有类似于windows画图的画图工具,功能也比较强大,支持各种格式的图片,也有各种工具,非常方便,安装的方法是: sudo apt-get install kolourpai ...

  5. python 环境安装

    wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz  tar zxf Python-2.7.3.tgz  cd Python-2. ...

  6. 160809209_李梦鑫_C语言程序设计实验2 选择结构程序设计

    实验2-1 输入3个数,并按由大到小的顺序输出. 实验要求: 编写一个C程序,输入3个数,并按由大到小的顺序输出. 源码:#include <stdio.h> int main() { i ...

  7. homework160809207刘兆轩

    # include <stdio.h> int main() { float a,b,c,m,n,l,k,j,i; printf("请输入三个数:\n"); scanf ...

  8. 一起入门python7之函数参数

    上一节课简单的讲了一下函数.那么今天来给大家讲一下函数参数.用案例说话哈.上一节课只是让大家有比较简单的了解,那么这节我们来细化一下哈.>>>def hello(x):        ...

  9. vSphere、Hyper-V与XenServer 你选哪个?

    vSphere.Hyper-V与XenServer 你选哪个? 当在VMware vSphere.Microsoft Hyper-V与Citrix Systems XenServer之间做出选择时,v ...

  10. POJ 3281 网络流dinic算法

    B - Dining Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...