基础的双指针位运算离散化区间合并+DP

cf Div.3 Round #693 补题总结

1472C - Long Jumps
题目分析:

  1. 题意:
    选择数组的起始位置i, 将物品放在该 (a[i])处。
    当 i ≤ n 时,得a[i]分,并物品向右移a[i] 。
    当 i > n 时,游戏结束。
    求以最优的方式选择起始位置,能得到的最大分数。
  2. 数据范围:104组测试样例,数组长度2*105
    遍历会超时…

那么, DP
通过选择位置j,可假设我们得到的结果a[j]比选择位置j+a[j]得到的大

公式:score( j ) = score( j + a[ j ] ) + a[ j ]

计算score的所有结果并将它们存储在数组中,利用公式 在 一次操作 中计算出score(i) 。
从末尾开始遍历,在位置 i,我们将知道所有 j > i 的score(j)。

vector<int> dp(n);
  for(int i=n-1;i >= 0;i--){
    dp[i]=a[i];
    int j=i+a[i];
    if(j<n) dp[i] += dp[j];
  }
  cout<<*max_element(dp.begin(),dp.end())<<endl;

D. Even-Odd Game
最优策略:每次取最大,无论奇偶。
注意数据范围

--------------------------------------------------------------分隔符--------------------------------------------------------------

1.5小结

  • 《算法基础课》4h
    图1

  • AcWing 10题 (795-799,801-803)
    图2

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值