P1515 旅行(dfs or dp)

dfs

#include<bits/stdc++.h>
using namespace std;
    //              已经有的旅馆列表:
int A,B,n,ans,a[40]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
void lx/*dfs*/(int k)//k:第k个旅馆 
{
	//所有旅馆都走过了[满足条件] 
	if(k==n){
		//方法+1 
		ans++;
		return;
	}
	//从第k个旅馆出发 
	for(int i=k+1;i<=n;i++)
	//(当日?)所走路程满足条件{A<=路程<=B} 
	   if(a[i]-a[k]>=A&&a[i]-a[k]<=B/*可以走*/)
	      lx(i);//去第i个旅馆
}
int main()
{
	cin>>A>>B>>n;
	//[输入]新增的旅馆(距起点)路程 
	for(int i=1;i<=n;i++)
	    cin>>a[13+i];
	//把新增的旅馆数和本有的旅馆数加起来(方便使用!) 
	n=n+13;
	//此时n代表所有旅馆数量! 
	//将旅馆路程远近(从小到大)排序{包括起点!} 
	sort(a,a+n+1);
	//从起点出发! 
	lx(0);
	cout<<ans;
	re

dp

#include<bits/stdc++.h>//超级万能头
using namespace std;
int a,b,n,ans[40],r[40]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
//旅馆初始化 
int main(){
	scanf("%d %d %d",&a,&b,&n);
	for (int i=14;i<14+n;i++) cin>>r[i];//输入 
	sort(r,r+14+n);//排序 
	ans[0]=1; //起始点默认一套方案 
	for (int i=1;i<14+n;i++){//枚举所有点 
		for (int j=0;j<i;j++){//枚举这个点之前的点 
			if (r[i]-r[j]>=a&&r[i]-r[j]<=b){//如果这两个点之间的距离符合要求 
				ans[i]+=ans[j];//这个点可以获得前面那个点的所有可能 
			}
		}
	}
	cout<<ans[13+n]<<endl;//输出到终点时的所有可能 
	return 0;//好习惯不可忘
}

over~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值