当前位置: 首页 > news >正文

树状dp(dfs)(一道挺基础的)

P1352 没有上司的舞会 

每个点都有两个状态(1/0),即选或者不选,如果选了,因此我们可以设置 dp[0][i]为点没选之后的最大值。 dp[i][1]设置为点选之后的最大值

转移方程:

dp[0][i]+=\summax(dp[1][son],dp[0][son]);

不去,那下属就可以想去就去。

dp[i][1]+=\sum(dp[0][son])+r[i];

去了那下属就一定不能去。

以这两个状态同时计算,往下递推,然后程序自然递归回来;

#include<bits/stdc++.h>
using namespace std;
const int N = 6e3 + 10;
int r[N];//每个人自己的开心
int dp[2][N];
vector<int> ed[N];//用来储存树的,一个上司不止1下属,
bool son[N];//看看有没有上司的,用来寻找最根的节点,方便遍历
void dfs(int x){
    dp[1][x] = r[x];//先给每个人来的状态设自己为基础开心dp[i][1]+=(dp[0][son])+r[i];//因为后面遍历加直系下属,所以先把这个加一次的提前加好;
    for(auto y:ed[x]){
         dfs(y);
         dp[1][x] += max(0,dp[0][y]);
        dp[0][x] += max(0,max(dp[1][y],dp[0][y]));
 }
}

int main(){
     int n;cin >> n;
     for(int i = 1;i <= n;i++)
        cin >> r[i];
     for(int i = 1;i <= n - 1;i++){
         int x,y;cin >> x >> y;
         son[x] = 1;//有上司就标是儿子
         ed[y].push_back(x);
     }
     int root;
     for(int i = 1;i <= n;i++)//没有上司就是顶头上司,根
     if(!son[i]){
         root = i;
         dfs(i);
     break;
     }
    cout << max(dp[0][root],dp[1][root]);
      return 0;
}

http://www.lryc.cn/news/575807.html

相关文章:

  • Spring Boot 项目问题:while constructing a mapping found duplicate key api
  • 微信小程序封装loading 修改
  • 常见网络安全威胁和防御措施
  • 智能实验室革命:Deepoc大模型驱动全自动化科研新生态
  • HTML简介,初步了解HTML
  • SQl中多使用EXISTS导致多查出了一条不符合条件的数据
  • 教程 | 一键批量下载 Dify「Markdown 转 Docx」生成的 Word 文件(附源码)
  • 【Linux】基础开发工具(2)
  • 操作系统面试知识点(1):操作系统基础
  • CyberGlove触觉反馈手套遥操作机器人灵巧手解决方案
  • Kotlin环境搭建与基础语法入门
  • 大厂测开实习和小厂开发实习怎么选
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • linux网络编程socket套接字
  • mysql无法启动的数据库迁移
  • WebSocket 与 HTTP 的区别及 Spring Boot 实战应用
  • [AI]从0到1通过神经网络训练模型
  • 128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器
  • C++智能指针概念及std::unique_ptr使用介绍
  • 【办公类-105-01】20250626 托小班报名表-条件格式-判断双胞胎EXCLE
  • CNN不是一个模型?
  • 跨越十年的C++演进:C++14新特性全解析
  • C++(模板与容器)
  • Java--程序控制结构(下)
  • springcloud 尚硅谷 看到9开头
  • NebulaGraph 图数据库介绍
  • 一分钟了解Transformer
  • 缓存与加速技术实践-MongoDB数据库应用
  • AI+时代已至|AI人才到底该如何培育?
  • Python打卡:Day37