很经典的一道题,也是很著名的一道状态压缩DP,十一的时候lch讲过但是没听懂= =,当时太弱(其实现在也很弱),然后也是因为这道题来学习了一下状态压缩dp,其实也没学多少,因为状态压缩说实话范围挺广的,可以hash可以离散化,可以bulabula..
然后这道题的思路理解之后其实也是蛮简单的,就是因为L太大,1e9时空都会超,又因为n<100,是一个稀疏图,所以呢,可以对他进行路径压缩,我们可以认为中间的点都是大跳过去的,所以对于长了很多的路程就去取模啊,模一模差不多就出来了。
我们用 f[i]表示在数轴的 i 点时所能踩石子的最少个数
那么很容易得出状态转移方程:
if(i点有石子) f[i]=min(f[i],f[i-j]+1)
else f[i]=min(f[i],f[i-j])
然而数轴长到fai起,那么我们就压缩一下
先把石子位置(用数组a来存放)从小到大排序,计算两两石子间的距离(用数组d来存放),如果距离<=t,那么a[i]=a[i-1]+d[i]
如果距离大于t,那么就需要压缩距离了,即 a[i]=a[i-1]+t+(d[i]%t)
然后还有要注意的两点
1.它的石子没说是已经排好序的,我看了样例以为都是排好序的,RE了一遍。
2.注意取p的范围,就是要在压缩的路程后面加一个t,因为不一定最后一个点刚好是石头最少的,可能是p+1,p+2,所以要从它转移过来,
【洛谷P1052】过河
最新推荐文章于 2020-08-21 08:16:57 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)