[Depth First Search] Counting Garlic: Blue Jump

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);
	
}

Guess you like

Origin blog.csdn.net/m0_52043808/article/details/123929439