zoukankan      html  css  js  c++  java
  • 动态规划空间优化之滚动数组

    使用范围:使用在递推或动态规划中

    作用:节约空间

    注意:时间上没什么优势

    举例

    1)作用在一维数组:

    普通方法:

    int d[]=new int[100];
     
    d[0]=1;d[1]=1;
     
    for(int i=2;i<100;i++)
    {
        d[i]=d[i-1]+d[i-2]
    }
     
    System.out.printf("%d",d[99]);

    上述方法使用100个空间(近似认为),

    注意,上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];为了节约空间用滚动数组的方法

    使用滚动数组:

    int d[]=new int[3];
     
    d[0]=1;d[1]=1;
     
    for(int i=2;i<100;i++)
    {
        d[i%3]=d[(i-1)%3]+d[(i-2)%3];
    }
     
    System.out.printf("%d",d[99%3]);

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

    2)作用在二维数组

    举例

    普通方法

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

    上面的方法需要1000×1000的空间。

    注意d[i][j]只依赖于d[i-1][j],d[i][j-1];可以使用滚动数组

    使用滚动数组:

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

    滚动数组使用2×1000的空间解决问题, 并且通过滚动,获得和1000×1000一样的效果。

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/137point5/p/12681404.html
Copyright © 2011-2022 走看看