hdu(3016) Man Down(线段树查询更新+dp)

这道ACM题目涉及线段树查询更新和动态规划。玩家初始站在最高层,生命值为100,每次下落选择最近的木板,木板分为增能和减能两种。若无合适木板或生命值耗尽则失败,否则求最大能量。通过线段树找到最近的下落点,并用动态规划计算最大能量。参考来源:http://xuyemin520.is-programmer.com/posts/25907.html
摘要由CSDN通过智能技术生成

这道题目可以说是游戏的简化版。

题目的大致意思是:

首先我们只有两种板,一种使能量增加,另一种却使能量减少。

最开始人物站在最高层,然后它一开始有100的生命值,它每次下落只能掉到离他最近的木板上去,当然他只能从左端点或者是右端点往下掉。

但是如果没有板满足如下情况的话,那么他就掉到最底下去了,如果此时他的能量小于等于0的话,那么他就会死亡,那么则输出-1;否则输出他所能获得能量的最大值。

现在的任务是叫你输出最大所能获得最大能量值。

思路:

1)我们要找到当前区间的分别从左右端点下去离他最近的下面那个区间

在这里可以用线段树进行维护,但是这东西还是很巧妙啊,真是难想。。。

我们这里找到的某个板的左右端点的a[i].left或是a[i].right是指它下落会落到的那块板的标号。

线段树中query操作这里其实与染色操作相类似的,就是查找到已经被染色的区间的标号。

update操作其实就是对从l,r区间进行染色,染为第i的颜色。

2)找到所能获得的最大能量值,这里要dp来做,虽然我没有想到这道题竟然可以这样转化方程:

dp方程:dp[left]=max(dp[left],dp[i]+a[a[i].left].val) ,  dp[left]等于要不是不经过第i块木板而下来的,要不是经过第i块木板下来的,这样的话就要加上第i块木板所含有的价值,显然,dp方程就是在这两个方案中寻找最大的价值。

参考来源:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值