【JZOJ3128】跳格子

奶牛们玩跳格子游戏,游戏中包含特定规则。通过动态规划(DP)和单调队列优化,求解每个点的最大得分,其中跳转规则包括必须返回前一位置。算法复杂度为O(nk),能够处理大量数据。

Description

奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1…N。

就像任何一个好游戏一样,这样的跳格子游戏也有奖励!第i个格子标有一个数字V_i(-2,000,000,000 <=V_i <= 2,000,000,000)表示这个格子的钱。奶牛们想看看最后谁能得到最多的钱。


规则很简单:


* 每个奶牛从0号格子出发。(0号格子在1号之前,那里没钱)


* 她向N号格子进行一系列的跳跃(也可以不跳),每次她跳到的格子最多可以和前一个落脚的格子差K格(1 <= K <= N)(比方说,当前在1号格,K=2, 可以跳到2号和3号格子)


* 在任何时候,她都可以选择回头往0号格子跳,直到跳到0号格子。

另外,除了以上规则之外,回头跳的时候还有两条规则:

* 不可以跳到之前停留的格子。


* 除了0号格子之外,她在回来的时候,停留的格子必须是恰巧过去的时候停留的某个格子的前一格(当然,也可以跳过某些过去时候停留的格子)。简单点说,如果i号格子是回来停留的格子,i+1号就必须是过去停留的格子,但如果i+1号格子是过去停留的格子,i号格子不一定要是回来停留的格子。


她得到的钱就是所有停留过的格子中的数字的和,请你求出最多奶牛可以得到的钱数。

analysis

  • DP+DP+DP+单调队列

  • f[i]f[i]f[i]iii点的答案,sum[i]sum[i]sum[i][1,i][1,i][1,i]的正数和

  • 方程就是f[i]=max(f[i],f[j]+a[i]+a[i−1]+sum[i−2]−sum[j])f[i]=max(f[i],f[j]+a[i]+a[i-1]+sum[i-2]-sum[j])f[i]=max(f[i],f[j]+a[i]

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值