题目https://www.luogu.org/problemnew/show/P1192
这是一道动态规划题,动态转移方程为 :
$$ans=\sum^{k}_{j=1}{f_{(i-j)}} (f_{0}=1)$$
#include<iostream> #include<cstdio> using namespace std; #define MAX 100005 #define mod 100003 int n,k; int bin[MAX]; int f(int i){ if(i==0)return 1;//当i为0时返回1 if(bin[i])return bin[i]%mod;//如果在做这个的时候f(i)已经被推出来了,就直接调用bin[i] for(int j=1;j<=k&&i-j>=0;++j)bin[i]=(bin[i]%mod+f(i-j)%mod)%mod;//没有就做一遍 return bin[i]%mod; } int main(){ scanf("%d%d",&n,&k); printf("%d\n",f(n)%mod);//注意最后也要%一下 return 0; }
290ms, 7200KB
#include<iostream> #include<cstdio> using namespace std; #define MAX 100005 #define mod 100003 int n,k; int bin[MAX]; int f(int i){ if(i==0)return 1; if(bin[i])return bin[i]%mod; for(int j=1;j<=k&&i-j>=0;++j)bin[i]=(bin[i]%mod+f(i-j)%mod)%mod; return bin[i]%mod; } int main(){ scanf("%d%d",&n,&k); printf("%d\n",f(n)%mod); return 0; }
220ms, 944KB
还是数组快
时间复杂度 O(nk)
原文:https://www.cnblogs.com/Lates/p/11129234.html