博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
滚动数组
阅读量:7091 次
发布时间:2019-06-28

本文共 779 字,大约阅读时间需要 2 分钟。

在DP中使用"滚动数组"

举个简单的例子:

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]);

上面这个循环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个解,数组好象在“滚动一样,所以叫滚动数组

对于二维数组也可以用这种方法 例如:

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];

上面的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];

滚动数组实际是一种节约空间的办法,时间上没什么优势,多用于DP中, 一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题, 并且通过滚动,获得和1000×1000一样的效果。

转载于:https://www.cnblogs.com/lzw6180/p/3227744.html

你可能感兴趣的文章
聪聪可可【国家集训队】
查看>>
二维数组的连续子数组的最大和
查看>>
DirectX11 SDK 下载地址
查看>>
solr4.5分组查询、统计功能介绍
查看>>
大一ACM心得总结
查看>>
一个线上问题的深思
查看>>
Spring Boot中集成Spring Security 专题
查看>>
phpnow修改默认站点根目录的方法
查看>>
协方差
查看>>
聚类算法:K-means
查看>>
5V转3.3v电路
查看>>
PL/SQL Developer登入时候报ORA-12638: 身份证明检索失败的解决办法
查看>>
ArcEngine下投影坐标和经纬度坐标的相互转换
查看>>
Apache AB 如何传递参数
查看>>
AOP
查看>>
java Map迭代
查看>>
npm配置文件
查看>>
MooseFs-分布式文件系统系列(四)之简单聊聊MFS的日常维护
查看>>
EasyShortcut Easyshortcut easyShortcut 简介
查看>>
WebRTC APM音频处理流程概述
查看>>