听闻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. 【C语言入门教程】2.9 小结

    本章介绍 C 语言的基本组成部分,数据类型.运算符 和 表达式 构成了 C 语言的语法,熟悉和掌握这些信息是学习 C 语言的必经之路.C 语言具备严谨的语法结构,任何细微的差错可导致程序无法通过编译, ...

  2. Ajax的使用

    Ajax是JQuery实现XMLHttpRequest的一种方式. 增加HTML5按钮,含有点击事件: <button type="button" class="b ...

  3. int (*p)[4] 与 int* p[4]

    碰到一道题: ][] = {,,,,,,,,,,,}; ]; ] = (a+); cout<<*(p+)<<endl; cout<<(*ptr+)[]<< ...

  4. Java设计模式 之 代理模式

    所谓的代理模式就是为其它类或对象提供一个代理以控制对这个对象的访问.那么常见的代理有远程代理,虚拟代理,保护代理,智能代理. 1. 远程代理:为一个不同地址空间的对象提供一个本地代理对象. 2. 虚拟 ...

  5. this.getServletContext().getRealPath("WEB-INF");

    this.getServletContext().getRealPath("WEB-INF");

  6. mongodb 维护

    如何释放空间? 1. 先用 remove 命令删除数据 2. repair.需要停机,即便你不停机的话 mongodb 自己也会锁住直到 repair 完成.注意要有足够的磁盘空间,需要额外一倍的空间 ...

  7. NSLock/NSRecursiveLock/NSConditionLock/@synchronized

    NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...

  8. leetcode150 Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  9. phpDocumentor 注释语法详解

    PHPDocumentor是强大的代码注释生成器,本文对各个参数进行了简单地的总结: @abstract-------------使用@abstract标记来声明一个方法,类变量或类必须重新定义子类中 ...

  10. apscheduler 排程

    https://apscheduler.readthedocs.org/en/v2.1.2/cronschedule.html 参数 说明 year 4位年 month 月份1-12 day 日:1- ...