滚动数组一般能节省较多的空间,能应用此方法的题目一般为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的取模即可。