滚动数组学习
来源:互联网 发布: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
- 滚动数组学习
- poj-1159-Palindrome-学习滚动数组
- hdu 1024(滚动数组的学习)
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- 滚动数组
- APK破解方法
- Java属性文件的读取和保存
- django 快速搭建blog
- android获得焦点后隐藏软键盘
- 内存_Highmemory
- 滚动数组学习
- NYIST 阶乘的0
- POJ 2187 凸包&旋转卡壳
- Cocos2d用裁剪区域CCClippingNode实现滚动字幕
- UCGUI使用总结
- int main(int argc,char* argv[])详解
- C++: 跨平台注意事项
- SPU/SKU/商品
- PS 滤镜——运动模糊