深度优先搜索+记忆化搜索: int dfs(len,flag):以及跳出的长度和上一次跳的距离是否大于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; 1.2.3.4.5.6.7.8.9. 代码: 登录后复制 #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); } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31. 记忆化搜索: 登录后复制 #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); } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37. 原创作者: u_16969274 转载于: https://blog.51cto.com/u_16969274/11820541