滚动数组学习

来源:互联网 发布:input file网络图片 编辑:程序博客网 时间:2024/05/16 17:12

滚动数组主要是应用在递推或者动态规划中,递推中可以参考那个斐波那契数列,而动态规划可以应用在01背包问题中去计算,他的作用主要是作用于空间,而对于时间没有作用,其实可以应用到滚动数组,主要是因为在通常的递推中,我们主要是应用了与该点相邻的点,那么递推的计算过程是自底向上的,那么距离该点很远的点我们就没有必要去考虑了,

例如斐波那契数列(主要是一维)

通常的做法:

#include<iostream>#include<cstdio>using namespace std;int Fib[25];int fib(int n){Fib[0] = 0;Fib[1] = 1;Fib[2] = 1;for(int i = 3; i <= n; ++i)Fib[i] = Fib[i - 1] + Fib[i - 2];return Fib[n];}int main(){int ncase, n, ans;scanf("%d", &ncase);while(ncase--){scanf("%d", &n);ans = fib(n);printf("%d\n", ans);}return 0;}

那么假如我应用了滚动数组来计算的话:

#include<stdio.h>#include<iostream>using namespace std;int f[3];int fib(int n){  f[0]=0;  f[1]=1;  if(n<2) return f[n];  for(int i=2;i<=n;i++)  {     f[2]=f[0]+f[1];     f[0]=f[1];     f[1]=f[2];  }  return f[2];}int main(void){ int n; while(scanf("%d",&n)!=EOF) {       printf("%d\n",fib(n));    } return 0;}

可以看到的是,应用了滚动数组后,我们不需要使用很多的空间就可以计算出相应的结果。

上面的程序主要是作用在一位数组上面的,那么假如我的程序是作用在二维数组那里呢?

现在假设我们要计算的是d[i][j]=d[i-1][j]+f[i][j-1];

我们应用通常的方法来进行处理的时候

/*#include<stdio.h>#include<iostream>using namespace std;const int maxn=200;int dp[maxn][maxn];int main(void){ int n,m; while(scanf("%d %d",&n,&m)!=EOF) {   for(int i=0;i<=m;i++){   dp[0][i]=1;}for(int i=0;i<=n;i++)  dp[i][0]=1;        for(int i=1;i<=n;i++)        {   for(int j=1;j<=m;j++)   {     dp[i][j]=dp[i-1][j]+dp[i][j-1];   }    }    cout<<dp[n][m]<<endl;    } return 0;}*//*1 1210 10184756100 1001149082645 5252*/

所消耗的空间为200*200;

那么我们如何使用滚动数组来进行计算呢?

CODE

#include<stdio.h>#include<iostream>using namespace std;const int maxn=200;int dp[2][maxn];int main(void){ int n,m; while(scanf("%d %d",&n,&m)!=EOF) {/* for(int i=0;i<=m;i++) {   dp[0][i]=1;   dp[i][0]=1; } dp[1][0]=1;//意思是说第二行第一个为1;      for(int i=1;i<=n;i++)     {        for(int j=1;j<=m;j++)        {  dp[1][j]=dp[1][j-1]+dp[0][j];//这里的前面为1   dp[0][j]=dp[1][j];}     }     */     //再修改一下     for(int i=0;i<=m;i++) {   dp[0][i]=1; } for(int i=1;i<=n;i++) {   for(int j=0;j<=m;j++)   {     dp[i%2][j]=dp[(i-1)%2][j]+dp[i%2][j-1];   } }      cout<<dp[n%2][m]<<endl;    } return 0;}//输出结果是/*1 1210 10184756100 1001149082645 5252*/

所消耗的空间为2*200,因此对于数字特别大的,不妨可以考虑滚动数组

终于今天学了滚动数组,继续学习
0 0
原创粉丝点击