题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337

题目大意:方块连接,呈树形。每个方块有两种接法,一种接在父块边上,宽度+1,一种接在父块上面,宽度+0。且一个母块最多有2个子块。问全局的宽度最小是多少。

解题思路

对于一个方块,就两种接法。

设dp[i][0]=0,表示接在父块上面。

dp[i][1]=1,表示接在父块边上。

对于一个父块,如果没有子块,宽度不变。

如果有一个子块,肯定接在上面,加上子块的宽度。

如果有两个子块,则有两种解法,max(左1上2),max(左2上1), 注意这里两个子块不是加起来,因为只要把管子伸长,让两个子块相互重叠掉一部分宽度,所以取max

那么接这两个子块就得加上这两种解法的较小值。(min)

最后结果是dp[1][1],和dp[1][0]没关系,因为1块肯定要占一个宽度。

#include "cstdio"
#include "iostream"
#include "cstring"
using namespace std;
#define maxn 10005
struct Edge
{
int next,to;
}e[maxn];
int dp[maxn][],head[maxn],tol;
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
void dfs(int root)
{
int cnt=,l1=,l2=,r1=,r2=;
dp[root][]=,dp[root][]=;
for(int a=head[root];a!=-;a=e[a].next) dfs(e[a].to);
for(int a=head[root];a!=-;a=e[a].next)
{
int t=e[a].to;
if(!cnt) {l1=dp[t][],l2=dp[t][];}
else {r1=dp[t][],r2=dp[t][];}
cnt++;
}
if(!cnt) return;
else if(cnt==) {dp[root][]+=l1;dp[root][]+=l1;}
else
{
int a=max(l1,r2),b=max(l2,r1);
dp[root][]+=min(a,b);dp[root][]+=min(a,b);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,u;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
tol=;
for(int i=;i<=n;i++)
{
scanf("%d",&u);
addedge(u,i);
}
dfs();
printf("%d\n",dp[][]);
}
}
3808409 2014-10-20 17:37:23 Accepted 3805 C++ 800 468 Physcal

ZOJ 3805 (树形DP)的更多相关文章

  1. ZOJ 3626(树形DP+背包+边cost)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3626 题目大意:树中取点.每过一条边有一定cost,且最后要回 ...

  2. ZOJ 3201 树形dp+背包(简单题)

    #include<cstdio> #include<vector> #include<cstring> #include<iostream> using ...

  3. Nuclear Power Plant ZOJ - 3840 树形dp

    There are N (1 ≤ N ≤ 105) cities on land, and there are N - 1 wires connecting the cities. Therefore ...

  4. ZOJ 3188 ZOJ 3188 Treeland Exhibition(树形DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3278 题意:给出一棵树,找出一个不大于长度为m的链,使得其他点到该链 ...

  5. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  6. 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】

    树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...

  7. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  8. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  9. poj3417 LCA + 树形dp

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

随机推荐

  1. 【数据库】如家汉庭酒店2000万开房数据1.71G/BAK,792M/CSV

    多家连锁酒店使用了某网络有限公司,开发的酒店WiFi管理.认证管理系统.用户在酒店连接开放的WiFi,上网时会被要求通过网页认证,填写相关信息.这个认证不是在酒店服务器完成的,而是在 某公司 的认证服 ...

  2. 【转】android中Uri.parse()用法

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  3. 【Spring】Spring系列4之Spring支持JDBC

    4.Spring支持JDBC 4.1.使用JdbcTemplate简化JDBC开发 也可以这么用(不推荐): 4.2.使用NamedParameterJdbcTemplate

  4. 编译 uImage

    编译 uImage 和测试 u-Boot - 小猪爱拱地 - 博客频道 - CSDN.NET http://blog.csdn.net/caspiansea/article/details/38057 ...

  5. cas单点登录用户名为中文的解决办法

    当用户名为中文时,登录后返回的用户名乱码.解决这个问题只需要在客户端的CAS Validation Filter中添加下配置就行了. <init-param> <param-name ...

  6. UML 序列图一点理解

    激活状态,就是长方形该画到哪里呢?我的理解是,一个长方形代表调用函数的执行过程,比如下图 这个长方形就表示viewDidAppear()函数没有执行完,在这个长方形上发出或者收到的消息都是在 view ...

  7. iOS 中通过使用Google API获得Google服务

    最近使用了google drive这个云存储,官方指导网址为 https://developers.google.com/drive/ios/ . 官方库代码网址为 http://code.googl ...

  8. HDU2018递推牛

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. php5.4.3连接SQLite3

    我使用的是WAMP2.2菜单-PHP-PHP extensions勾选php_sqlite3<?php$conn = new SQLite3("c:/wamp/www/test.db& ...

  10. VelocityTracker简介

    android.view.VelocityTracker主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率.用addMovement(MotionEvent)函数将Mot ...