斐波那契与滚动数组!

我们先来看个著名数列:

斐波那契数列

已知序列1,1,2,3,5,···求序列第x位为多少;
朴素做法就是:a[x]=a[x-1]+a[x-2];
如果是按上面的做法,空间大小可能会很大了,然而对于第x个数字,我们只需要知道x-1和x-2就可以了于是我们这里就引入滚动数组优化。

什么是滚动数组?

滚动数组就是根据数组的特点(一般是对成品代码进行修改)进行空间压缩,虽然没有时间上的优化,但在空间上的优化非常的明显。
对于dp一类的题目,不存在后效性,所以一般前面算好的值就会固定封存,对于当前的状态只需要前面的几个值就可以了,而其他的值也就可以舍去。所以用滚动数组优化很有优势。对于递归一类的题目(例如斐波那契)也是适用的,道理同上。

滚动数组怎么用?

举个栗子:关于斐波那契数列的代码滚动优化,我们就可以写成 a[i%3]=a[(i-1)%3]+a[(i-2)%3];

Q1:为什么要用mod

(待定)

Q2:为什么是mod3

其实这里有几个变量就mod几个就可以了

注意滚动数组一次性只能优化一维

我们以最长上升子序列例:

for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
		if (a[j]==k) f[i][j]=f[i-1][j-1]+1;
		else f[i][j]=max(f[i-1][j],f[i][j-1]);

对于f[i][j]可以讲f[i]给优化掉,变为f[i%2]以及f[(i-1)%2],然而如果f[i][j]中的后一维被优化掉,则会丢失前面记录的信息。所以在滚动数组里面,为了保证信息的完整性,我们只优化一维。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值