0%

首次团队赛回顾

浪潮完赛,杜神太强了最后20min成功冲出全场唯二的D题(%%%),最后rank8极限一等奖,这次总归没有遗憾离场。

黄金

题面
题目描述
Laz 在寒假领了一大笔压岁钱,因为最近黄金价格的疯涨,现在她想利用这笔压岁钱去购买黄金,现在给定一个n天的时间周期,并给出黄金在这 n天内的价格变化,Laz 的压岁钱十分充足,可以支持她进行任意次交易。
Laz 选择在黑市购买黄金,但是想在黑市购买黄金需要遵循以下规则:
同一时间最多持有1份黄金,不然会引起其他人的关注;
卖出后必须冷却1天才能再次买入;
每次卖出需要支付固定手续费k。
现在Laz想让你规划,该采取怎样的方案购置黄金才能获得最大利润

dp这一块实在是短板,这题主要是我在看,想到了记录买入和卖出的两种状态记录,没想到第三维保持当前状态的维度。

我们定义每天有三种状态
hold:手中持有黄金,且当天没有卖出操作。
sold:当天卖出黄金。
rest:手中没有黄金,且没有其他操作,继承上一天的状态。

new_hold:新持有黄金或者说黄金没有卖出,故存在自rest转移过来新买黄金或自hold继续持有继承而来。
new_sold:欲卖出定持有,故只能由hold转移而来。
new_rest:手中无黄金的休整冷却期,可以由sold卖出后转移而来或原rest继承而来。

new_hold=max(rest-a[i],hold)
new_sold=hold+a[i]-k
new_rest=max(rest,sold)

状态转移方程确定之后剩下的就简单了

1
2
3
4
5
6
//初始化
hold=-INF;
sold=0;
rest=0;
for()//遍历一遍,每次用new记录之后整体更新
cout<<max(sold,rest)