【例题·搜索】Addition Chains(迭代加深搜索)

来源:POJ2248

题目大意

规定第一个数为1,第二个数是2,你需要找到长度为m的序列使得这一个序列中每一个数都有前面的两个相同或不同的数拼凑而成,输出这一个m最小的任意序列方案(SPJ)。

做法

首先需要说一下什么叫做迭代加深搜索

在某一颗搜索树上,如果答案在这一棵树的浅层那么我们如果在深度较大的子树上搜索就会浪费很多的时间,因此我们需要需要控制搜索的深度,不断的从浅层向深层进行扩展。

具体的做法就是,每次不断枚举一个深度,如果深度超出则退出。例如在本题中,我们就可以从小到大枚举m,如果存在合法解就直接输出即可。

但是迭代加深的限制就是:答案一定在浅层,如果在深层就直接原地爆炸 了;例如在这道题中因为第n很小,即m的大小不会超过n,所以我们可以使用迭代加深搜索。

做一个区分:如果这道题直接使用深度优先搜索算法,那么你的方案已定是朝着不优的防线前进的;例如,最优的m是5,你可能会在m=6,7,8等数中越走越远,因此这道题需要使用迭代加深搜索。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,deep;
int a[200000];
int v[200000];
bool dfs(int x)
{
   
	if (x>deep) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值