原标题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801

题意:给定一颗有根树,在树上下层的节点要给上层节点礼物,根节点的礼物则给慈善会,可是给礼物有个条件就是你不能送你的父节点已经送出的礼物。问满足要求的最少花费。

题解:这个题卡了一段时间,相似于染色问题,能够用树形动态规划求解。由于已知节点个数为N,则我们单个节点的最大花费不会超过log2(N) = 18。

1. 设dp[i][j]是在i节点花费j时以i为根节点的子树所须要的总开销。

2. 则dp[i][j] = sum{min{dp[son][k],1 <= k <= 18且k != j},son为i的每一个子节点};

比赛的时候一開始使用DFS,没注意到节点规模在树成链状时会导致暴栈。可是时间已经来不及了,非常遗憾没有进入round 2。

代码例如以下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define maxN 200005
#define maxM 18 vector<vector<int> > sons;
int N;
int minCost[maxN][maxM]; struct node
{
int ID;
int depth;
friend bool operator< (node x,node y)
{
return x.depth > y.depth;
}
}employee[maxN]; int BFS()
{
for(int i = 1;i <= N;i++)
{
employee[i].ID = i;
}
employee[1].depth = 0;
int now,next;
int sonSize;
queue<int> q;
q.push(1);
while(!q.empty())
{
now = q.front();
q.pop();
sonSize = sons[now].size();
for(int i = 0;i < sonSize;i++)
{
next = sons[now][i];
q.push(next);
employee[next].depth = employee[now].depth+1;
}
}
} int dp()
{
int fa,son,sonSize;
int i,j,k,m;
int tmpMinCost;
BFS();
sort(employee+1,employee+N+1);
for(i = 1;i <= N;i++)
{
fa = employee[i].ID;
sonSize = sons[fa].size();
for(j = 1;j <= maxM;j++)
{
minCost[fa][j] = j;
for(k = 0;k < sonSize;k++)
{
son = sons[fa][k];
tmpMinCost = INT_MAX;
for(int m = 1;m <= maxM;m++)
{
if(m == j)
continue;
tmpMinCost = min(tmpMinCost,minCost[son][m]);
}
minCost[fa][j] += tmpMinCost;
}
}
}
int ans = INT_MAX;
for(i = 1;i <= maxM;i++)
{
ans = min(ans,minCost[1][i]);
}
return ans;
} int main()
{
freopen("corporate_gifting.txt","r",stdin);
freopen("out.txt","w",stdout);
int T;
int fa;
scanf("%d",&T);
for(int i = 1;i <= T;i++)
{
scanf("%d",&N);
vector<vector<int> >().swap(sons);
sons.resize(N+1);
for(int j = 1;j <= N;j++)
{
scanf("%d",&fa);
sons[fa].push_back(j);
}
printf("Case #%d; %d\n",i,dp());
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树动态规划)的更多相关文章

  1. Facebook Hacker Cup 2015 Round 1--Winning at Sports(动态规划)

    原题:pid=688426044611322&round=344496159068801">https://www.facebook.com/hackercup/problem ...

  2. Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)

    题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数 ...

  3. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  4. 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)

    1182 完美字符串             题目来源:                         Facebook Hacker Cup选拔         基准时间限制:1 秒 空间限制:1 ...

  5. Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!

    VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...

  6. Facebook Hacker Cup 2014 Qualification Round

    2014 Qualification Round Solutions 2013年11月25日下午 1:34 ...最简单的一题又有bug...自以为是真是很厉害! 1. Square Detector ...

  7. VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) E. Correcting Mistakes 水题

    E. Correcting Mistakes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  8. VK Cup 2015 - Round 1 -E. Rooks and Rectangles 线段树最值+扫描线

    题意: n * m的棋盘, k个位置有"rook"(车),q次询问,问是否询问的方块内是否每一行都有一个车或者每一列都有一个车? 满足一个即可 先考虑第一种情况, 第二种类似,sw ...

  9. VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp

    题目链接: http://codeforces.com/problemset/problem/533/B B. Work Group time limit per test2 secondsmemor ...

随机推荐

  1. 奋斗的孩子的TableView(三篇文章)

    http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html http://blog.sina.com.cn/s/blog_a6fb6cc90101hhse ...

  2. hdu1565+hdu1569(最大点权独立集)

    传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...

  3. linux内核笔记-内核同步

    linux内核就相当于不断对请求进行响应的服务器,这些请求可能来自CPU,可能来自发出中断的外部设备.我们将内核看作两种请求的侍者. (1)老板提出请求,侍者如果空闲,为老板服务.(系统调用或异常) ...

  4. 【ASP.NET】验证控件

    在软件开发中,验证输入信息是否正确,这是不可缺少的一项工作.就拿我们做过的机房收费系统来说,在登录的时候,我们须要对username和用户password进行验证.推断是否为空,推断输入字符是否合理等 ...

  5. 二、第一个ExtJS程序:helloExtJS

    开发前的准备 下载并解压ExtJS包后,能够得到下图的文件文件夹结构: 在实际开发过程中并不须要全部的文件和文件夹,所需的包括例如以下文件夹就可以: 若使用eclipse进行开发,仅仅需将上述文件拷贝 ...

  6. 一个有趣的swap函数

    C语言版: void swap (int a, int b) { a = a ^ b; b = a ^ b; a = a ^ b; } 原理: a ^ a == 0 0 ^ b == b 异或:同则为 ...

  7. 什么样的企业造什么样的软件最easy成功?

    事件1: 一般软件企业按功能分,大体分业务应用型软件和系统工具型软件. 按市场分,应用型软件企业较多,直接贴近生活:系统工具类较少,间接贴近大众较少. 事件2: 软件企业中,当中中小型企业老板存在非常 ...

  8. JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

  9. 控制台打印Hibernate的SQL语句显示绑定参数值

    问题? 使用Hibernate提供的show_sql内置属性true只能输出类似于下面的SQL语句:Hibernate:   insert into user(name,password) value ...

  10. 算法8-4:Kruskal算法

    Kruskal算法用于计算一个图的最小生成树.这个算法的过程例如以下: 依照边的权重从小到达进行排序 依次将每条边添加到最小生成树中,除非这条边会造成回路 实现思路 第一个步骤须要对边进行排序,排序方 ...