洛谷-P1352 没有上司的舞会(树形dp模板题)

博客围绕洛谷P1352没有上司的舞会题目展开。题目是给定有n个节点的树,各节点有权值,选一个节点则其儿子节点不能选,求选取部分节点的最大权值。分析采用树形dp和记忆化搜索,定义了两种状态下的最大权值并通过dfs填数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷-P1352 没有上司的舞会

题目

给一颗树,n 个节点,每个点都有权值,选了一个节点,那么它的儿子们就不能被选。求选取一部分节点后权值最大多少?

分析

树形dp,用记忆化搜索。

d p [ x ] [ 0 ] dp[x][0] dp[x][0] 表示以 x x x 节点为跟的子树,不选 x x x 节点 情况下,最大权值。
d p [ x ] [ 1 ] dp[x][1] dp[x][1] 表示以 x x x 节点为跟的子树,选 x x x 节点 情况下,最大权值。

dfs 搜一下填数组

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 9999991;
const int N = 6e3 + 10;

int n, x, y, r;
int val[N], rt[N], dp[N][2];
vector<int> son[N];

void DP(int rt){
    dp[rt][0] = 0;          //不选自己
    dp[rt][1] = val[rt];    //选自己
    for(auto x : son[rt]){
        DP(x);				//利用儿子更新自己之前先把儿子求出来
        dp[rt][0] += max(dp[x][0], dp[x][1]);
        dp[rt][1] += dp[x][0];
    }
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        scanf("%d", &val[i]);
    }
    for(int i = 1; i <= n; i++){
        scanf("%d%d", &x, &y);
        rt[x] = 1;                  //有上司
        son[y].push_back(x);
    }
    for(int i = 1; i <= n; i++){    //找根节点
        if(!rt[i]){
            r = i;
            break;
        }
    }
    DP(r);
    printf("%d\n", max(dp[r][1], dp[r][0]));
    return 0;
}
内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值