树形dp hdu-4616-Game

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程 本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。 阅读详情

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4616

题目大意:

给一棵树,每个节点有一个礼物值及是否有trick,每来到一个节点必须拿礼物,如果该节点有trick则浪费一个抗trick机会,如果一开始有C次抗trick的机会,问最多可以拿多少值的礼物,机会用完后就结束了。访问了的节点不能再次访问。

解题思路:

树形dp啊。

树形dp很不熟悉阿阿阿阿阿阿阿阿。。。。

dp[i][j][0]表示从节点i开始,有j次机会,在子树中最大的能拿到礼物的值。

dp[i][j][1]表示从节点i开始,有j次机会,在子树中次大的能拿到礼物的值。

by[i][j]表示i节点,有j次机会时,得到最大值的那个直接儿子标号。

先以任意一点为根,dfs一遍。求出从每个节点的开始的在子树中的最大值和次大值。

再以同一点为根,dfs一遍,参数维护一个以父亲为开始节点且不经过该节点的最大值。求出该节点出发的在整棵树中的最大值。

PS:

注意此题麻烦的地方是,当机会恰好用完时,游戏结束,不能累加后面的0机会值。

所以要分该节点是否有trick来判断,如果有trick的话,只有j>=2时有从后面更新。

PS2:要多做树形dp啊。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);

#define Maxn 55000
ll dp[Maxn][5][2]; //dp[i][j][0]表示从i节点开始有j个机会,在子树中能达到的最大值
int tra[Maxn],val[Maxn],cnt,n,c;
int by[Maxn][5];
ll ans;

struct Edge //邻接表
{
   int v;
   struct Edge * next;
}edge[Maxn<<1],*head[Maxn<<1];

void add(int a,int b)
{
   ++cnt;
   edge[cnt].v=b,edge[cnt].next=head[a];
   head[a]=&edge[cnt];
}
ll Max(ll a,ll b)
{
   return a>b?a:b;
}
void dfs1(int pre,int cur)
{
   struct Edge * p=head[cur];
   bool flag=true;
   while(p)
   {
      if(p->v!=pre)
      {
         flag=false;
         dfs1(cur,p->v); //先计算出子树情况
         if(tra[cur]) //该节点有trick
         {
            dp[cur][1][0]=val[cur];
            for(int i=2;i<=c;i++) //必须大于等于2的情况才可能从后面更新
            {
               if(dp[p->v][i-1][0]+val[cur]>=dp[cur][i][0])
               {
                  dp[cur][i][1]=dp[cur][i][0];//更新次大
                  dp[cur][i][0]=dp[p->v][i-1][0]+val[cur];
                  by[cur][i]=p->v;
               }
               else if(dp[p->v][i-1][0]+val[cur]>dp[cur][i][1])
               {  //更新次大
                  dp[cur][i][1]=dp[p->v][i-1][0]+val[cur];
               }
            }
         }
         else
         { //如果没有trick,则可以到达其他点任何点
            for(int i=0;i<=c;i++)
            {
               if(dp[p->v][i][0]+val[cur]>=dp[cur][i][0])
               {
                  dp[cur][i][1]=dp[cur][i][0];
                  dp[cur][i][0]=dp[p->v][i][0]+val[cur];
                  by[cur][i]=p->v;
               }
               else if(dp[p->v][i][0]+val[cur]>dp[cur][i][1])
               {
                  dp[cur][i][1]=dp[p->v][i][0]+val[cur];
               }
            }
         }
      }
      p=p->next;
   }
   if(flag) //叶子节点单独处理
   {
      for(int i=tra[cur];i<=c;i++)
         dp[cur][i][0]=val[cur];
   }
}
void dfs2(int pre,int cur,ll *aa)
{
   ll MM=0;
   if(tra[cur])
   {
      MM=dp[cur][c][0];//从子树中找
      if(c>=2)
         MM=Max(MM,aa[c-1]+val[cur]); //从父亲找
   }
   else
      MM=Max(dp[cur][c][0],aa[c]+val[cur]);
   if(MM>ans)
      ans=MM;
  /* printf("cur:%d ans:%I64d \n",cur,MM);
   for(int i=0;i<=c;i++)
      printf("aa[%d]:%I64d   ",i,aa[i]);
   putchar('\n');
   system("pause");*/
   struct Edge * p=head[cur];
   while(p)
   {
      if(p->v!=pre)
      {
         ll tt[5]={0}; //tt[i]表示父亲有i次机会且不通过该儿子时能达到的最大值
         if(tra[cur])
         {
            tt[1]=dp[cur][1][0]; //注意更新
            for(int i=2;i<=c;i++)
            {
               if(p->v!=by[cur][i]) //最大值是该儿子,用次大的来更新
                  tt[i]=Max(aa[i-1]+val[cur],dp[cur][i][0]);
               else
                  tt[i]=Max(aa[i-1]+val[cur],dp[cur][i][1]);
            }
         }
         else
         {
            for(int i=0;i<=c;i++)
            {
               if(p->v!=by[cur][i])
                  tt[i]=max(aa[i]+val[cur],dp[cur][i][0]);
               else
                  tt[i]=max(aa[i]+val[cur],dp[cur][i][1]);
            }
         }
        /* for(int i=0;i<=c;i++)
            printf("i:%d %d\n",i,tt[i]);*/
         dfs2(cur,p->v,tt);
      }
      p=p->next;
   }

}

int main()
{
   int t,a,b;

   //freopen("1006.in","r",stdin);
   //freopen("1006ans.out","w",stdout);
   scanf("%d",&t);
   while(t--)
   {
      scanf("%d%d",&n,&c);
      memset(by,-1,sizeof(by));
      memset(head,NULL,sizeof(head));
      for(int i=0;i<n;i++)
         scanf("%d%d",&val[i],&tra[i]);
      cnt=0;
      for(int i=1;i<n;i++)
      {
         scanf("%d%d",&a,&b);
         add(a,b);
         add(b,a);
      }
      memset(dp,0,sizeof(dp));
      ans=0;
      dfs1(-1,0);
      ll tt[5]={0};
      dfs2(-1,0,tt);
      printf("%I64d\n",ans);
   }
   return 0;
}



Unity Shader实战:用Matcap给你的低模角色快速换上‘次世代’材质(附完整Shader代码) 本文详细介绍了Unity中Matcap技术的实战应用,通过Shader代码实现低模角色的次世代材质表现。Matcap技术利用预烘焙光照贴图,显著提升材质质感同时保持极低性能消耗,特别适合移动游戏和独立开发。文章包含完整Shader代码、平面模型着色优化方案及动态环境反射增强技巧,帮助开发者快速提升低模视觉效果。 阅读详情

相关推荐

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4815

GAME (HDU)(博弈论)

0的时候:假如余数是op,那我们就变到op+9*0 ,op+9*1,op+9*2...,那么操作数就是 0 1 2 ...,假设有n个余数是op的数,那么重复的操作次数就是n*(n-1)/2。那么我们对每个数来说,%9余数是0的我们最终的数应该是9 18 27...也就是1*9 2*9 3*9,那么多算的不数就是1 2 3...假设个数为n那么重复的操作数就是n*(n+1)/2。还有一个问题是不能有重复的数,那我们先算能减的最多的数,然后我们再减去重复的操作数。

qq_61903556的博客 470

linux离线安装nginx

linux离线安装nginx

zhang_130914036的博客 9347

HDU - 4616 Vases and Flowers(线段树 -区间更新 + 二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给你你个花瓶,开始时n个花瓶都是空的,且从0 -> n-1编号,m此操作,操作分两种。 (1)给一个起点a和花的数量f问从a开始知道把f朵花全部插入花瓶中或者到达最后一个,求这个区间的左边界和有边界。 (2)给一个区间x,y问这个区间内一共有多少朵花,并将这些花扔掉。 思路:我们假设...

qq_43423395的博客 171

三维Copula建模进阶:从对称、嵌套到Pair-Copula(C-Vine/D-Vine)到底怎么选?

本文深入探讨三维Copula建模的进阶策略,包括对称Archimedean、嵌套结构和Vine Copula(C-Vine/D-Vine)的选择方法。通过对比数学特性、计算复杂度和实际应用案例,提供了一套针对金融风险分析等场景的决策框架,帮助分析师根据数据特征选择最优模型。

weixin_27038701的博客 436

【研路导航】重庆大学计算机保研面试真题分享交流

在保研的道路上,面试是非常重要的一环。轻保研提供了成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答!Q 快速排序和合并排序:快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列,并且递归地对所得的两个子序列分别排序。请阐述快速排序及合并排序两种算法之间的主要区别。

gradlight的博客 1588

HDU 6850 Game (博弈+dp)

题意:n个点,起初石子在第一个点,Dodo 和 ddd 轮流移动石子到一个从未访问过的点,且每次移动的距离必须大于前一段的距离,两人采取最优策略,求Dodo是否必胜。 题解:博弈+dp dp[x][y]dp[x][y]dp[x][y]:x到y这条边是否为必胜态。若该状态是必胜态,那么从y到任意点的边所代表的状态都是必败态。 由此,我们记忆化搜索即可。 但是还有一个问题,就是我们在dfs的时候并没有考虑访问的点之前是否已经访问过,其实这是可以忽略的,因为距离递增,最终必然确定一个状态,由此就可以推得前驱状态了

gongyuandaye的博客 221

SQLite性能优化:从WAL模式到内存映射的深度解析

本文深入解析SQLite性能优化策略,重点介绍WAL模式和内存映射技术的应用。通过合理配置WAL日志、同步策略和事务批处理,SQLite的IO吞吐量可提升3-5倍。结合内存映射和缓存优化,性能可进一步提升至默认配置的50倍,适用于高并发读写场景。

weixin_29231027的博客 455

HDU 6312 Game(博弈)

题目链接:Game 题意 AliceAliceAlice 和 BobBobBob 两人玩一个博弈游戏,由 AliceAliceAlice 先开始,两人轮流进行下面的操作:在 111 到 nnn 个数字构成的集合中选择一个整数 xxx,然后将 xxx 及 xxx 的所有约数都从集合中删去,无法进行操作的一方失败。问如果双方都采取最优策略,AliceAliceAlice 能否取得胜利。 ...

Dmaxiya 333

10分钟极速SpringBoot项目搭建:OpenClaw AI实战攻略

OpenClaw,作为一款革命性的 AI 工具,凭借其强大的智能体能力,能够在短短 10 分钟内,帮助开发者从零构建一个完整的 SpringBoot 项目,实现真正的极速开发。它不仅极大地提高了开发效率,还降低了开发门槛,让更多的开发者能够专注于业务逻辑的实现,而无需被繁琐的配置工作所困扰

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 298

告别 DIFY 构建卡顿 / 失败!巧用 Makefile 一键构建本地 WEB 镜像,附核心避坑指南

本文详细介绍了DIFY本地源码构建WEB镜像的完整流程,重点解决因官方npm源不稳定导致的构建失败问题。通过修改web/Dockerfile文件启用国内npmmirror镜像源,可大幅提升依赖下载速度和稳定性。在DIFY根目录执行封装好的make build-web命令即可一键完成构建,无需手动编写复杂docker命令。文章还提供了前置环境准备、构建结果验证等实用指导,帮助开发者高效完成DIFY前端二次开发后的镜像构建验证。

2501_93651177的博客 182

HDU - 3672 Caves【树形DP+背包】

HDU - 3672  题意:给一棵带权树,初始位置在根节点,最多有1000次询问,问你在x(x 分析:树上的背包问题,对背包问题理解还是不够深刻啊,自己写的时候模型是正确的,动归方程没写出啦,然后参考一下博客。 如果探索完所有点并回到根节点,则所用时间为探索过的所有节点之间的权值的两倍(来回两次)。如果不回到根节点,则减掉所有探索点到当前根节点的最长路径。 因为查询次数较多,

tystrwor的博客 530

YOLOv11 损失函数进阶:Varifocal Loss 让正负样本精度双升

创建self.alpha = alpha # 正样本权重系数self.gamma = gamma # 聚焦系数self.lambda_reg = lambda_reg # 回归损失权重# 分类损失:Varifocal Classification Loss# 正样本权重:基于预测置信度# 计算 BCE 损失并加权cls_loss = cls_loss.sum() / (cls_true.sum() + 1e-6) # 按正样本数归一化。

m0_71589036的博客 441

HDU 4616 Game 树形DP

Problem Description   Nowadays, there are more and more challenge game on TV such as ‘Girls, Rush Ahead’. Now, you participate int a game like this. There are N rooms. The connection of rooms is like ...

日拱一卒,功不唐捐 2842

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU 4616 Game(树形dp,两遍dfs)

题目链接: HDU 4616 Game 题意: 给一个nn个节点和n−1n-1条边的树。每个节点代表一个房间,每个房间都放有一个价值为正的礼物,有的房间有陷阱,有的房间没陷阱,最多可以经过CC个陷阱(第CC个陷阱时就应该停止),可以从任意的房间开始行走,每个房间只能走一次,求获得的礼物的最大价值和? 数据范围:n≤5∗104,1≤C≤3n\leq 5*10^{4},1\leq C \le

ramay7 649

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

hdu 4616 Game 树形dp

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意 有n个房间构成的一棵树,每个房间都有一定价值的礼物,价值可能不相同,有礼物的同时还可能有陷阱,而且每个房间不能重复经过,如果掉入陷阱C次或者没有路可以走了那么游戏结束,求从任意点出发能获得礼物的最大价值。 解题思路 树形dp。 dp[i][j][0] 表示从i的子树上某点出发经

呼,是出一口气;吸,是争一口气! 844

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hdu 4616 Game(树形dp)

题目链接:hdu 4616 Game解题思路dp维护不以trap为起点的最优,ed维护以trap为起点的最优。注意,当前节点如果不为trap的话,不能从dp[K]转移过来。代码#include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn = 50005; typedef lon

不慌不忙、不急不躁 819

HDU 4616 Game(树形dp)

题意: 给定N≤5×104一棵无根树,每个节点个权值,且可能有陷阱给定N\le 5\times 10^4一棵无根树, 每个节点个权值, 且可能有陷阱 现在从任意一个节点出发,如果无路可走或者踩到C≤3个陷阱就停止了现在从任意一个节点出发, 如果无路可走或者踩到C\le3个陷阱就停止了 求能获得最大的权值和求能获得最大的权值和 分析: 树形dp,经典题,蓝儿我并不会做树形dp, 经

TaoSama's Microcosm 631

HDU 4616 Game(树形DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意:给出一棵树,每个点有个价值。有些点是陷阱,有些点不是。要求在树上选一个起点开始走,每个点最多被遍历一次。在第m次进入一个陷阱点时结束(或者在之前就结束,即最多经过m个陷阱点且在第m个陷阱点必须停止)。求最大价值。 思路:头脑混乱写的比较复杂。。 从0节点开始向下,并且在每个节点都...

weixin_34195364的博客 162

【HDU】4616 Game 树型DP

传送门:【HDU】4616 Game

poursoul 1182

HDU 4616 Game (树形DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意:一颗有n个节点的树,每个节点有val值和c(有无陷阱)值,给出最大可踩陷阱数m。在树中任取一点作为起点,经过某点就取得该点的val值,踩到第m个陷阱后马上停止,而且不能走已走过的点,求所能获得的最大val总值。 思路:比赛时对每个点作为起点写了个爆搜,队友说如果某点u相邻的...

Tongqi 595

hdu4616 Game 【树形dp】

题解详见:http://blog.youkuaiyun.com/martinue/article/details/51025232 分析透彻。#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<vector> #include<qu

cdsszjj的博客 373

HDU 4616 Game (搜索)、(树形dp)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4616 这道题目数据可能比较弱,搜索都可以AC,但是不敢写,哎…… 搜索AC代码: #include #include #include #include #include #include #include #include #include #include

lamborghini1993 1240

*hdu 4616 Game 树形DP

Description Nowadays, there are more and more challenge game on TV such as 'Girls, Rush Ahead'. Now, you participate int a game like this. There are N rooms. The connection of rooms is like a

lastone的专栏 486

【树形DP】 HDU 4616 Game

原题直通车:HDU 4616 Game 题意:有棵树上有n个结点,每个点有若干价值的礼物,有些点可能有馅阱,有m次掉入馅阱的机会,但       第m次掉入馅阱后则不能再走,并每个点最多只能经过一次。问:可以任意点为起点,最多可以拿       到总价值多大的礼物。 分析:       分两种情况:           Ⅰ、以馅点做为起始点           Ⅱ、以非馅阱点做为

PWZER 734

HDU 4616 Game 树形DP 搜索

题目描述:Description   Nowadays, there are more and more challenge game on TV such as ‘Girls, Rush Ahead’. Now, you participate int a game like this. There are N rooms. The connection of rooms is like a t

喵头鹰的博客 423
上一篇: hdu-4611-Balls Rearrangement
下一篇: 贪心+容斥原理-337E. Divisor Tree
Accagain
博客等级 码龄14年 376粉丝 316原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值