vijos 1002过河[单调dp,滚动数组,离散化]

本文介绍了如何解决NOIP中的过河问题,通过使用单调动态规划(DP)和滚动数组进行优化,降低空间复杂度。在S小于T的情况下,采用离散化策略进一步提高效率,当S等于T时需要特殊判断处理,以避免TLE(超时错误)。
摘要由CSDN通过智能技术生成

这道题是NOIP第一道DP优化题,看似容易,实际上想要满分也颇有难度。

传送门:1002 过河

算法

此题显然要用到DP,DP方程也显而易见:
if (stone[i]) f[i]=min{f[i-j]}+1; (S<=j<=T)
else f[i]=min{f[i-j]};
这样的时间复杂度为 O(LT) ,空间复杂度为 O(L)
而此题的L高达 10亿 ,所以这种朴素的方法只能得 30分 ,显然无法AC。

优化

1.滚动数组
根据我们得出的DP方程,状态转移只需用到 f[i-T]~f[i-S] 的值,所以只需开大小为T的滚动数组即可。
所以空间复杂度被优化到了 O(T) 。由于T小于等于10,所以空间上显然没有问题。
2.离散化DP
看了看别人的题解,发现有人选择压105位来优化,这种方法虽然能过,但是或多或少有投机取巧的嫌疑,毕竟比赛时谁知道去压正好105位呢?
所以我们必须想出一般性的方法。我们会发现,石头的个数M远远小于长度L,不禁让我们想到了离散化——当S<T且有一大段桥没有石头时,常常会出现整个滚动数组f的值一样的情况,这时我们可以在遇到下一颗石头之前不再改变f的值,从而达到优化的效果。
在下用tot变量记录当前数值连续出现的次数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值