Búsqueda en profundidad + búsqueda memorizada:
int dfs(len, flag): y si la longitud del salto y la distancia del último salto son mayores que p
si (largo == 0) devuelve 0;
si (largo==l)retorno1;
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;
Código:
#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);
}
Búsqueda memorizada:
#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);
}