一看到这道题就知道是树形dp

之前做过类似的题,只不过保护的范围是1

所以简单很多。

这道题保护的范围是2,就复杂了很多。

我就开始列状态,然后发现竟然有5种

然后我就开始列方程。

但是我考虑的时候是用一条链去思考的。

显然应该要用深度为3的完全二叉树去思考。

所以我写到一半发现自己的方程有问题。

然后就干脆放弃了,因为思维量好大。

然后去看题解。发现我完成了正解的三分之一。

后面的方程写出之后还需要很牛逼的简化。

我花了很长时间才理解。

自己还是太菜了。
http://www.cnblogs.com/QWsin/p/5306197.html

这道题还有贪心的做法

每次找到最深没有被覆盖的点,然后到爷爷建一个消防站

代码很简单。

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1123;
int g[MAXN][MAXN], fa[MAXN];
int d[MAXN], vis[MAXN], n, x; void dfs(int u, int d) //这种dfs写法很棒
{ //表示把距离u为d的节点全部遍历一遍。
vis[u] = 1;
if(d == 0) return;
_for(i, 1, n)
if(g[u][i])
dfs(i, d - 1);
dfs(fa[u], d - 1);
} int main()
{
scanf("%d", &n);
_for(i, 2, n)
{
scanf("%d", &x);
g[x][i] = 1;
fa[i] = x;
} fa[1] = 1;
_for(i, 1, n)
d[i] = d[fa[i]] + 1; int ans = 0;
while(1)
{
int p = 0;
_for(i, 1, n)
if(!vis[i] && d[i] > d[p])
p = i;
if(p == 0) break;
dfs(fa[fa[p]], 2);
ans++;
}
printf("%d\n", ans); return 0;
}

洛谷上还有比较快的做法

普适性比较强,可以解决半径为k的最小覆盖问题。

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1123;
int d[MAXN], fa[MAXN], p[MAXN], k[MAXN], n; bool cmp(int a, int b) { return d[a] > d[b]; } int main()
{
scanf("%d", &n);
p[1] = 1; k[1] = k[0] = n;
_for(i, 2, n)
{
scanf("%d", &fa[i]);
d[i] = d[fa[i]] + 1;
k[i] = n;
p[i] = i;
}
sort(p + 1, p + n + 1, cmp); int ans = 0;
_for(i, 1, n)
{
int u = p[i], f = fa[u], g = fa[fa[u]];
k[u] = min(k[u], min(k[f] + 1, k[g] + 2));
if(k[u] > 2)
{
k[g] = 0; ans++;
k[fa[g]] = min(k[fa[g]], 1);
k[fa[fa[g]]] = min(k[fa[fa[g]]], 2);
}
}
printf("%d\n", ans); return 0;
}

洛谷 P2279 [HNOI2003]消防局的设立 (树形dp or 贪心)的更多相关文章

  1. 洛谷 P2279 [HNOI2003]消防局的设立 题解

    每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去 ...

  2. P2279 [HNOI2003]消防局的设立[树形dp]

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...

  3. 洛谷P2279 [HNOI2003]消防局的设立

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...

  4. 洛谷 P2279 [HNOI2003]消防局的设立

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...

  5. BZOJ1217或洛谷2279 [HNOI2003]消防局的设立

    BZOJ原题链接 洛谷原题链接 该题有两种做法,树形\(DP\)和贪心. 先讲贪心. 先将所有点按深度从大到小排序,然后从大到小依次取出点,若已经被覆盖则跳过,否则就在它的祖父点建立消防站. 考虑如何 ...

  6. 【BZOJ1217】[HNOI2003]消防局的设立 树形DP

    [BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...

  7. 洛谷 2279 [HNOI2003]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...

  8. [HNOI2003]消防局的设立 树形dp // 贪心

    https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...

  9. bzoj1217: [HNOI2003]消防局的设立 [树形dp]

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...

随机推荐

  1. (转载)springboot集成httpinvoker的客户端

    原文:https://blog.csdn.net/geanwan/article/details/51505679 由于新项目采用了springboot,需要调用之前远程服务(之前项目用的spring ...

  2. 关于@SuppressWarnings("unchecked")注解

    解释一: 屏蔽某些编译时的警告信息         在强制类型转换的时候编译器会给出警告        加上程序代码        @SuppressWarnings("unchecked& ...

  3. 【【henuacm2016级暑期训练】动态规划专题 N】Valid Sets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 给你一棵树. 让你统计其中子树T的数量. 这个子树T要满足最大值和最小值之差小于等于d 树形DP 可以枚举点root为子树的根. 统 ...

  4. java源码之HashSet

    1,HashSet介绍 1)HashSet 是一个没有重复元素的集合.2)它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素.3)HashSet是非同步的.如果多 ...

  5. java源码之TreeMap

    Map的单元是对键值对的处理,之前分析过的两种Map,HashMap和LinkedHashMap都是用哈希值去寻找我们想要的键值对,优点是理想情况下O(1)的查找速度. 那如果我们在一个对查找性能要求 ...

  6. WinServer-IIS-Dynamic IP Restrictions

    动态IP限制 来自为知笔记(Wiz)

  7. [React] Use the new React Context API

    The React documentation has been warning us for a long time now that context shouldn't be used and t ...

  8. 浅析Java抽象类和接口的比較

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是因为这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  9. Revolution Platform

    Revolution Platform 黑暗的极权统治现实 异类的处境 独孤的存在 觉者的形成 信仰的确立 信仰的产物 完整的思想理论 反抗与信仰的一致 反抗的超理性的智慧论 反抗的纯理性的方法论 反 ...

  10. JDBC-Statement 对象

    Statement 对象 一旦我们获得了数据库的连接,我们就可以和数据库进行交互.JDBC 的 Statement,CallableStatement 和 PreparedStatement 接口定义 ...