滚动数组

来源:互联网 发布:淘宝店面粉红招牌图片 编辑:程序博客网 时间:2024/05/16 10:15

滚动数组一般能节省较多的空间,能应用此方法的题目一般为DP,背包此类有递推关系式的题目。

拿斐波那契数列举个例子:

#include<stdio.h>int main(){int n;int dp[105]={0,1,1};scanf("%d",&n);for(int i=3;i<=n;i++)    dp[i]=dp[i-1]+dp[i-2];    printf("%d\n",dp[n]);    return 0;} 

dp[i]=dp[i-1]+dp[i-2]; i>=3

这里可以看到当前状态只跟之前的两个状态有关,也就是说dp[i-k],k>=3,那些都是没用的。

所以我们可以对上式Mod3。

#include<stdio.h>int main(){int n;int dp[3]={0,1,1};scanf("%d",&n);for(int i=3;i<=n;i++)    dp[i%3]=dp[(i-1)%3]+dp[(i-2)%3];    printf("%d\n",dp[n%3]);    return 0;} 
你所要开的数组大小就由前面几组会对当前状态产生影响决定。
这是一维的情况,若问题为多维的思路也是一样的,找出有影响的维度和可以Mod的维度,将可以mod的取模即可。

0 0
原创粉丝点击