倍增 基本理解

本文介绍了倍增算法在求解到达特定位置的最短步数问题中的应用,通过实例详细解释了倍增过程,展示了如何通过动态规划优化计算效率,减少步数。同时,提出了使用二维数组f[a][b]来存储中间状态,并给出了初始化和更新数组的代码片段。倍增算法的高效性在解决此类问题中得到了体现。

说起倍增的话说实在的也没有那么难。

就比如说,你要到第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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值