首页 > 其他分享 >Luogu P1352没有上司的舞会

Luogu P1352没有上司的舞会

时间:2023-10-01 22:55:27浏览次数:27  
标签:舞会 int Luogu head edge P1352 节点 dp happy

分析

树形 dp。

定义状态 \(dp_{~i,~0}\) 为在以 \(i\) 为根节点的子树中,不选第 \(i\) 个人的最大快乐值,\(dp_{~i,~1}\) 为在以 \(i\) 为根节点的子树中,选第 \(i\) 个人的最大快乐值。

寻找根节点,然后从根节点开始 dfs,当前节点 \(u\) 的 \(dp\) 初始状态为 \(dp_{~i,~0}=0,~dp_{~i,~1}=happy_{~i}\)。

思考状态转移方程:

注:下文中当前节点以 \(u\) 来表示,\(u\) 的儿子以 \(v\) 来表示。

  • 没有选择当前节点这个人:他的下司可以被选择和不被选择,状态转移方程为 \(dp_{~u,~0} = \sum max(dp_{~v,~0},dp_{~v,~1})\),
  • 选择当前节点这个人:不能选择他的下司,状态转移方程为 \(dp_{~u,~1} = \sum dp_{~v,~0}\)

Accepted Code

#include <bits/stdc++.h>
using namespace std;
const int N = 6e3 + 5;
struct Edge{
	int v, nxt;
}edge[N];
int head[N], happy[N], dp[N][2], in[N];
void dfs(int u)
{
	dp[u][0] = 0; dp[u][1] = happy[u];
	for (int i = head[u]; i; i = edge[i].nxt)
	{
		int v = edge[i].v;
		dfs(v);
		dp[u][0] += max(dp[v][0], dp[v][1]);
		dp[u][1] += dp[v][0];
	}
}
int main()
{
	int n, rt;
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> happy[i];
	for (int i = 1; i < n; i++)
	{
		int u, v;
		cin >> v >> u;
		in[v]++;
		edge[i] = (Edge){v, head[u]}; head[u] = i;
	}
	for (int i = 1; i <= n; i++)if (!in[i])rt = i;
	dfs(rt);
	cout << max(dp[rt][0], dp[rt][1]);
	return 0;
}

标签:舞会,int,Luogu,head,edge,P1352,节点,dp,happy
From: https://www.cnblogs.com/Manipula/p/17739562.html

相关文章

  • Luogu P1350车的放置
    分析排列组合题目,但是dp做法。存储当前列的高度\(h_i\),这里反着存,更好转移。定义状态\(f_{i,k}\)为在前\(i\)列放置\(k\)个车的方法数。初始状态\(f_{i,0}=1\)。分析状态转移方程:当前列不放置车时:方法数为\(f_{i-1,j}\)当前列放置车时:方法数为\(f_{i,j-1}*......
  • LuoguP2809 hzwer爱折纸
    Luogu原题链接爆搜的思路不难想到,就是将翻折的操作进行模拟,再将翻折后的数组进行dfs然后重复该操作。但是处理翻折操作十分复杂,中间的细节很多。首先纸条可以翻转,大部分人都看到了,所以在爆搜中加入了翻转的操作,但只需要在判定时反向的也判一次就行了,至于正确性你们可以自行......
  • luogu P4819 [中山市选] 杀人游戏 题解 【强连通分量+缩点】
    目录题目链接思路分析代码题目链接P4819思路分析首先考虑这道题的连通性。容易发现这种类型的题目会容易产生环形的状态转移。假设我们知道了其中的一个点是否是黑白点,那么我们就可以知道所有点是否是黑白点。容易陷入一个误区:我们只能通过一个点知道他所相邻的最直接的点,如何......
  • Luogu9157「GLR-R4」夏至
    抢到最优解了,UOJ校验码上80pts过不去。/kk这里是官方题解的简化。首先考虑\(n=1\)怎么做,相当于对\(m\le10^{10}\)筛出\(f\)的前缀和。由于\(f(p)=p\),直接构造函数\(g(n)=n\)然后PN筛\(O(\sqrtm)\)求即可。然后考虑\(n>1\),由于\(n\)比较小,考虑对每一个\(i......
  • Luogu-P4315 月下“毛景树”
    在洛谷中查看前言将边权转化到点权的树剖,很好理解,但我就说说线段树部分。原本想做P1505[国家集训队]旅游的,但是发现它需要边权转化点权,所以先做了这题,于是代码里维护了\(minn\)、\(maxn\)、\(sum\)。包含内容:线段树部分怎么写、本题随机数据生成器线段树怎么写先试着......
  • 【LuoGu】3047 Nearby Cows G ——两次DFS+树上DP
    [USACO12FEB]NearbyCowsG题目描述给你一棵\(n\)个点的树,点带权,对于每个节点求出距离它不超过\(k\)的所有节点权值和\(m_i\)。输入格式第一行两个正整数\(n,k\)。接下来\(n-1\)行,每行两个正整数\(u,v\),表示\(u,v\)之间有一条边。最后\(n\)行,每行一个非负整数......
  • 【LuoGu】2014 选课——树上DP
    [CTSC1997]选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有\(N\)门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有......
  • luogu P1419 题解
    题目链接description给定一个长度为\(n\)的序列(值域为\([-10^4,10^4]\))和正整数\(st,ed\)。求一个区间,使得其长度\(\in[st,ed]\)且平均值最大,输出平均值。\(1\leqn\leq10^5\)solution这里给出一个复杂度线性的做法。求出前缀和数组\(s\),答案相当于\(\max\limit......
  • Luogu P5290 [十二省联考 2019] 春节十二响
    LuoguP5290[十二省联考2019]春节十二响题目链接题目大意一颗有根树,有点权,把点分成若干个集合,要求每个集合内不包含祖先关系,求集合的最大值的和的最小值.做题思路考虑合并两个集合,我们只需要不停把分别吧两个集合的最大值取出取max加入答案,再把大集合剩下的内......
  • 【LuoGu】1351 联合权值
    [NOIP2014提高组]联合权值题目描述无向连通图\(G\)有\(n\)个点,\(n-1\)条边。点从\(1\)到\(n\)依次编号,编号为\(i\)的点的权值为\(W_i\),每条边的长度均为\(1\)。图上两点\((u,v)\)的距离定义为\(u\)点到\(v\)点的最短距离。对于图\(G\)上的点对\((u,v......