【深度优先搜索】计蒜客:蓝跳跳_记忆化搜索

深度优先搜索+记忆化搜索:

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.