zoukankan      html  css  js  c++  java
  • 滚动数组

    利用在数组长度N很大的情况下能达到压缩存储的作用。一般还是用在DP题目和递归中,因为DP题目是一个自下而上的扩展过程,我们常常用到是连续的解,而每次用到的只是解集中的最后几个解,所以以滚动数组形式能大大减少内存开支。

    比如:斐波那契数列

    #include<iostream>
    using namespace std;
    int main()
    {
        int i;
        long long d[80];
        d[0]=1;
        d[1]=1;
        for(i=2;i<80;i++)
        {
            d[i]=d[i-1]+d[i-2];
        }
       cout<<d[79]<<endl;
        return 0;
    }

    上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];

    为了节约空间用滚动数组的方法

    #include<iostream>
    using namespace std;
    int main()
    {
        int i;
        long long d[3];
        d[0] = 1;
        d[1] = 1;
        for(i=2;i<80;i++)
        {
            d[i%3]=d[(i-1)%3]+d[(i-2)%3];
        }
        cout<<d[79%3]<<endl;
        return 0;
    }

    再比如二维数据:

    int i, j, d[100][100];
    for(i = 1; i < 100; i++)
        for(j = 0; j < 100; j++)
            d[i][j] = d[i - 1][j] + d[i][j - 1];

    上面的d[i][j]只依赖于d[i - 1][j], d[i][j - 1]; 

    用滚动数组:

    int i, j, d[2][100];
    for(i = 1; i < 100; i++)
        for(j = 0; j < 100; j++)
            d[i % 2][j] = d[(i - 1) % 2][j] + d[i % 2][j - 1];

    滚动数组实际是一种节约空间的办法,时间上没什么优势,比如:

    一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题,并且通过滚动,获得和1000×1000一样的效果。

  • 相关阅读:
    2879. [NOI2012]美食节【费用流】
    luogu P1012 拼数
    luogu cover
    luogu cogs . [NOIP2003] 传染病控制 WA(1/2)
    luogu P1340 兽径管理 WA
    luogu P1342 请柬
    HTML学习笔记二
    HTML学习笔记一
    arr.sort()
    编写函数实现随机产生指定范围的整数的功能
  • 原文地址:https://www.cnblogs.com/hrlsm/p/12826486.html
Copyright © 2011-2022 走看看