题目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