zoukankan      html  css  js  c++  java
  • 小技巧—滚动数组

    小技巧—滚动数组

    滚动数组是常见的一种空间优化方式。

    应用是递推算法,动态规划(其实现方式是递推)。

    举个栗子:

    斐波那契数列是递推的一个最好的例子,它的递推公式是:

    [fib_n=fib_{n-1}+fib_{n-2} ]

    也就是说,我们只需要知道n-1和n-2项就能知道第n项,第n项跟前面的所有项都没关系。

    所以我们完全可以只开一个长度为3的数组来完成这个过程。

    代码:

    #include<cstdio>
    using namespace std;
    int d[3];
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	d[1]=1,d[2]=1;
    	for(int i=3;i<=n;i++)
    	{
    		d[0]=d[1];
    		d[1]=d[2];
    		d[2]=d[0]+d[1];
    	}
    	printf("%d",d[2]);
    	return 0;
    }
    

    同理,以0/1背包为例,因为其转移只涉及到了(dp[i-1])(dp[i])这两维度的状态,所以可以用滚动数组转移。

    这种数组的滚动可以通过模运算实现。

    滚成多少就模几。

    比如上面的代码,也可以这么实现:

    #include<cstdio>
    using namespace std;
    int d[3];
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	d[1]=1,d[2]=1;
    	for(int i=3;i<=n;i++)
    		d[i%3]=d[(i-1)%3]+d[(i-2)%3];
    	printf("%d",d[n%3]);
    	return 0;
    }
    
  • 相关阅读:
    1052 卖个萌 (20 分)
    1046 划拳 (15 分)
    1051 复数乘法 (15 分)
    1042 字符统计 (20 分)哈希
    1041 考试座位号 (15 分)哈希
    1061 判断题 (15 分)
    1093 字符串A+B (20 分)简单哈希
    Hibernate框架
    SVN的安装与介绍
    easyUI的简单操作
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13754119.html
Copyright © 2011-2022 走看看