Depth-first search + memoized search:
int dfs(len, flag): and whether the length of the jump and the distance of the last jump are greater than p
if(len==0)return 0;
if(len==l)return1;
res=0;
if(flag==0)//上一步跳的距离小于p,那么这一次跳的距离为1~k
{
for(i:1~p-1)res+=dfs(len+i,0);
for(i:p~k)res+=dfs(len+i,1);
}else{
for(i:1~p-1)res+=dfs(len+i,0);
}
return res;
Code:
#include<iostream>
using namespace std;
int k;
int p;
int l;
int dfs(long long len,int flag){
if(len>l)return 0;
if(len==l)return 1;
int res=0;
if(flag==0){
for(int i=1;i<p;i++){
res+=dfs(len+i,0);
}
for(int i=p;i<=k;i++){
res+=dfs(len+i,1);
}
}
else{
for(int i=1;i<p;i++){
res+=dfs(len+i,0);
}
}
return res;
}
int main(){
cin>>k>>p>>l;
cout<<dfs(0,0);
}
Memoized search:
#include<iostream>
#include<algorithm>
using namespace std;
int k,p,l;
int dp[1000000][2];
const int mod=20201114;
int dfs(int sum,int pre){
if(dp[sum][pre]){
return dp[sum][pre];
}
if(sum>l)
{a
return 0;
}
if(sum==l){
return 1;
}
if(!pre){
for(int i=1;i<=k;i++){
if(i>=p)
dp[sum][pre]=(dp[sum][pre]+dfs(sum+i,1))%mod;
else
dp[sum][pre]=(dp[sum][pre]+dfs(sum+i,0))%mod;
}
}
else{
for(int i=1;i<=p-1;i++){
dp[sum][pre]=(dp[sum][pre]+dfs(sum+i,0))%mod;
}
}
return dp[sum][pre];
}
int main(){
cin>>k>>p>>l;
cout<<dfs(0,0);
}