• 滚动数组(转)


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

    用法:

    #include <iostream>
    using namespace std;
    int d[3];

    int main()
    {
        d[0] = 1;d[1] = 1;
        for( int i = 2; i < 100; i++)
            d[i % 3] = d[(i - 1) % 3] + d[(i - 2] % 3];
        cout << d[99 % 3] << endl; // Fibonacci...
        return 0;
    }

    int i,j,d[2][100];//比d[100][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 ....



    滚动数组 举个简单的例子:
    int i,d[100];
    d[0]=1;d[1]=1;
    for(i=2;i<100;i++)
    d[i]=d[i-1]+d[i-2];
    printf("%d",d[99]);
    上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];
    为了节约空间用滚动数组的方法

    int d[3];
    d[0]=1;d[1]=1;
    for(i=2;i<100;i++)
    d[i%3]=d[(i-1)%3]+d[(i-2)%3];
    printf("%d",d[99%3]);

    注意上面的运算,我们只留了最近的3个解,数组好象在“滚动‿一样,所以叫滚动数组

    对于二维数组也可以用这种方法 例如:
    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中,举个例子先: 
    一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题,并且通过滚动,获得和1000×1000一样的效果。

  • 相关阅读:
    Unity3d vector3.forward和transform.forward的区别!
    UGUI实现摇杆
    UGUI实现拼图游戏
    Unity3d打包发布Android程序
    兼容PC和手机触摸代码
    unity3d中Transform组件变量详解
    运算符重载
    扩展方法
    string.Format格式化输出
    网络编程之Socket的TCP协议实现客户端与客户端之间的通信
  • 原文地址:https://www.cnblogs.com/PegasusWang/p/2980417.html
Copyright © 2020-2023  润新知