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

Eating Everything Efficiently(树形DP+思维)

传送门


1.题目大意:给出一个有向无环带权图,现在从0号节点进入,每到一个节点都可以选或者不选,如果选并且这是选择的第 i i i个节点,那么产生的贡献是 w i 2 i − 1 {\frac{w_i}{2^{i-1}}} 2i1wi,求最大贡献

2.虽然这是一个图的问题,但是有向图也可以看做有根树,我们直接dfs即可。然后我们发现在这个问题中如果考虑从前向后转移,是一件很麻烦的事情,因为每个节点都可能选或不选,这样对后面节点的影响是未知的。因此我们可以这样想,不用上面的计算公式,如果当前节点选,那么相当于后面选的节点都除以二,这个过程我们可以在dfs回溯的时候完成,即每次先让 d [ u ] d[u] d[u]保存其所有子节点的最大值,然后状态转移:

d [ u ] = m a x ( d [ u ] , d [ u ] / 2.0 + a [ u ] ) d[u]=max(d[u],d[u]/2.0+a[u]) d[u]=max(d[u],d[u]/2.0+a[u])

那么最后的答案就是对每个阶段的答案取 m a x max max

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <bitset>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=5e5+10;

vector<int> G[maxn];
double a[maxn],d[maxn];
int n,m;
double ans;

void dfs(int u){
    if(d[u]) return;
    d[u]=0.0;
    for(auto v: G[u]){
        dfs(v);
        d[u]=max(d[u],d[v]);
    }
    d[u]=max(d[u],d[u]/2.0+a[u]);
    ans=max(ans,d[u]);
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        u++,v++;
        G[u].push_back(v);
    }
    dfs(1);
    printf("%.6f",ans);
    return 0;
}

相关文章:

  • Windows cmd下的GNUgpg的使用方法
  • Codeforces Round #653 (Div. 3)(A-E1)
  • Linux hdparm命令使用方法
  • UVA - 11582 Colossal Fibonacci Numbers!(找循环节)
  • UVA - 12169 Disgruntled Judge(枚举+扩展欧几里得)
  • ASM管理命令和操作笔记
  • UVA - 10791 Minimum Sum LCM(质因数分解)
  • 删除ASM残留信息方法和重建步骤
  • UVA - 12716 GCD XOR(找规律+枚举技巧)
  • Oracle 修改归档模式
  • UVA - 1635 Irrelevant Elements(质因数分解)
  • spfile和pifle的一点浅浅的认识
  • 欧拉函数
  • UVA - 1636 Headshot(条件概率)
  • Oracle RAC日常基本维护命令
  • 77. Combinations
  • CSS实用技巧
  • DataBase in Android
  • express.js的介绍及使用
  • java8 Stream Pipelines 浅析
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • maya建模与骨骼动画快速实现人工鱼
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • NSTimer学习笔记
  • STAR法则
  • tensorflow学习笔记3——MNIST应用篇
  • 测试开发系类之接口自动化测试
  • 大整数乘法-表格法
  • 对JS继承的一点思考
  • 高程读书笔记 第六章 面向对象程序设计
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 什么是Javascript函数节流?
  • 说说动画卡顿的解决方案
  • 详解移动APP与web APP的区别
  • 国内开源镜像站点
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (10)STL算法之搜索(二) 二分查找
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法)N皇后问题
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)fock函数详解
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 6 集成和使用 mongodb
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET导入Excel数据
  • .net和php怎么连接,php和apache之间如何连接
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • []新浪博客如何插入代码(其他博客应该也可以)