说起倍增的话说实在的也没有那么难。
就比如说,你要到第500500500个点那里去,那么用普通的办法的话那就是一个一个走,走到第五百个点那里。
那如果倍增呢?。一开始我就走292^929步(假设的啦)。发现$2 ^ $是512512512,大于500500500,那就走282^828步,发现是256256256,小于500500500,那就走了。还差244244244步。这个数字绝对不会大于256256256的,要不然512512512肯定就能走了OrzOrzOrz。有点麻烦,大概需要时间揣摩。
然后就接着走啊,走272^727步,也就是128128128,发现可以走,那就走啊!这时候还剩116116116步。再走!262^626步,也就是646464步!可以走!那就走上!还差525252步。252^525步也就是323232这时候也可以走,那就走呗,还差202020步,接着走242^424,也就是161616步,还差四步。这时候发现232^323大于444,那就不走,走222^222,正好走完。
用倍增我们一共走了666次,那可比500500500不知道少到哪里去了!!
一般会用这么一个数组f[a][b]f[a][b]f[a][b]来表示倍增,其中aaa表示起点,bbb表示走了2b2^b2b步。
那么初始化就是:
for(int i = 1; i <= n; i++)
f[i][0] = w[i];
之后的处理大概就是:
for(int i = 1; i <= 20; i++){
for(int j = 1; j <= n; j++){
f[i][j] = f[f[i][j - 1]][j - 1];
}
}
然后用它解决问题就行了OrzOrzOrz
本文介绍了倍增算法在求解到达特定位置的最短步数问题中的应用,通过实例详细解释了倍增过程,展示了如何通过动态规划优化计算效率,减少步数。同时,提出了使用二维数组f[a][b]来存储中间状态,并给出了初始化和更新数组的代码片段。倍增算法的高效性在解决此类问题中得到了体现。
8262

被折叠的 条评论
为什么被折叠?



