听闻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语言入门教程】4.5 指针变量的定义与引用

    指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与 ...

  2. Ubuntu 12 安装 MySQL 5.6.26 及 问题汇总

    参考先前的文章:Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记 安装过程: #安装依赖库 sudo apt-get install ...

  3. linux下svn命令使用大全

    最近经常使用svn进行代码管理,这些命令老是记不住,得经常上网查,终于找了一个linux下svn命令使用大全:1.将文件checkout到本地目录 svn checkout path(path是服务器 ...

  4. OS X 10.10.5编译Android5.1.1源码

    --------------------------------------------------写在前面---------------------------------------------- ...

  5. 个人建了一个APPCAN移动前端开发交流QQ群258213194

    QQ群号:258213194,欢迎有兴趣的同志加一下. 二维码如下:

  6. 各大互联网公司前端面试题(js)

    对于巩固复习js更是大有裨益.    初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型 ...

  7. Redis Windows下安装部署

    下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.我下载的是2.8.12版的,相信大家百度一下就可以搜到,这就是我们需要的: 启动R ...

  8. mysql 在linux 修改账号密码

    1.root用户登录到mysql数据库代码示例:/usr/local/mysql/bin/mysql -u root -p (输入密码进入mysql)2.进入mysql,输入:代码示例:use mys ...

  9. iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片

    一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  10. 快速入门SaltStack

    导读 SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS EC2实例),它的底层使用ZeroMQ消息队列pub/sub方式 ...