热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

迭代加深搜索+双向搜索

迭代加深搜索: 从小到大限制搜索的深度,如果当前限制下搜不到答案,再把深度限制增加,重新进行一次搜素(没错,会存在重

迭代加深搜索:

从小到大限制搜索的深度,如果当前限制下搜不到答案,再把深度限制增加,重新进行一次搜素(没错,会存在重复搜索)。
例题:

POJ 2248 Addition Chains

满足如下条件的序列X(序列中元素被标号为1、2、3…m)被称为“加成序列”:
1、X[1]=1
2、X[m]=n
3、X[1] 4、对于每个 k(2≤k≤m)都存在两个整数 i 和 j (1≤i,j≤k−1,i 和 j 可相等),使得X[k]=X[i]+X[j]。
你的任务是:给定一个整数n,找出符合上述条件的长度m最小的“加成序”。
如果有多个满足要求的答案,只需要找出任意一个可行解。
输入格式
输入包含多组测试用例。
每组测试用例占据一行,包含一个整数n。
当输入为单行的0时,表示输入结束。
输出格式
对于每个测试用例,输出一个满足需求的整数序列,数字之间用空格隔开。
每个输出占一行。
数据范围
1≤n≤100
输入样例:
5
7
12
15
77
0
输出样例:
1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77


#include
#include const int maxn = 110;
using namespace std;
int n, x, a[maxn], sum[maxn];int dfs(int now, int deep, int last) {//当前now深度,deep最大深度,last为上一次的数值,我们要满足数列的单调递增性.if (a[now] == n) return 1;if (now >= deep) return 0;for (int i = now; i >= 1; i--)for (int j = i; j >= 1; j--) {if (!sum[a[i] + a[j]] && a[i] + a[j] >=last){a[now+1] = a[i] +a[j];sum[a[i]+a[j]] = 1;int sm=dfs(now+1,deep,a[i]+a[j]);if (sm) return sm;sum[a[i]+a[j]] = 0;a[now+1];}else{if (!sum[a[i]+a[j]]) break;}}return 0;
}int main() {while (cin >> n && n) {a[1] &#61; 1;a[2] &#61; 2;int s, k &#61; n;if (n > 2) {if (n > 20) k &#61; 6;//这个剪枝非常精髓else k &#61; 3;for (; k <&#61; 10; k&#43;&#43;) {//k一定小于10因为1 2 4 8 16 32 64 128memset(sum, 0, sizeof(sum));memset(a, 0, sizeof(a));a[1] &#61; 1;a[2] &#61; 2;s &#61; dfs(2, k, 3);if (s !&#61; 0) break;}}for (int i &#61; 1; i <&#61; k; i&#43;&#43;)cout << a[i] << &#39; &#39;;cout << endl;}
}

双向搜索

从初态和终态出发各搜索一半状态&#xff0c;产生两颗深度减半的搜索树&#xff0c;在中间教会&#xff0c;组合成为最终的答案。
双向搜索又名折半搜索。当搜索的复杂度在指数级的时候&#xff0c;我们可以通过将指数折半的方法降低搜索复杂度。
具体做法是从初态和终态出发各搜索一半状态&#xff0c;产生两颗深度减半的搜索树&#xff0c;两颗树交汇在一起形成最终答案&#xff0c;将O(nk)O(nk)降低到O(nk/2&#43;nk/2&#43;1)O(nk/2&#43;nk/2&#43;1)的复杂度。
其实对于这样的指数级复杂度&#xff0c;如果指数除以2后可以接受的话&#xff0c;可以考虑双向搜索。

CH2401 送礼物

传送门
达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了N个礼物&#xff0c;其中第i个礼物的重量是G[i]。
达达的力气很大&#xff0c;他一次可以搬动重量之和不超过W的任意多个物品。
达达希望一次搬掉尽量重的一些物品&#xff0c;请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。

输入格式
第一行两个整数&#xff0c;分别代表W和N。

以后N行&#xff0c;每行一个正整数表示G[i]。

输出格式
仅一个整数&#xff0c;表示达达在他的力气范围内一次性能搬动的最大重量。

数据范围
1≤N≤45,
1≤W,G[i]≤231−1
输入样例&#xff1a;
20 5
7
5
4
18
1
输出样例&#xff1a;
19


因为w过大&#xff0c;没法使用背包&#xff0c;可是直接的搜索是 O(2N)O(2^N) O(2N)级别的&#xff0c;可是我们这题的N的范围到45&#xff0c;正常无法解决。所以考虑双向搜索。
把礼物分为两半&#xff0c;首从前一半礼物中选出若干个&#xff0c;可能达到的0~W之间的所有重量值&#xff0c;放在数组里排序去重。再进行第二次搜索。
对于每一个第一部分达到的重量t&#xff0c;在第二部分数组中二分查找<&#61;w-t的数值中的最大值。这个算法的时间复杂度是O(2N/2log2N/2)&#61;O(N∗2N/2)O(2^{N/2}log2^{N/2})&#61;O(N*2^{N/2})O(2N/2log2N/2)&#61;O(N2N/2)
分半也存在一些细节可以优化时间&#xff0c;不要耿直的 N/2&#xff0c;资料上说 1~N/2&#43;2 分法经过随机数据验证是最快的。

#include
using namespace std;
const int N&#61;(1<<24)&#43;1;
long long ans,n,m,a[N],s[N],n_2;
long long find(int val)//二分查找
{int l&#61;1,r&#61;n_2,check&#61;m-val;//最大可以承受的值while(l<r){int mid&#61;(l&#43;r&#43;1)>>1;if (s[mid]<&#61;check)l&#61;mid;elser&#61;mid-1;}ans&#61;max(ans,s[l]&#43;val);//当前最大值与全局最大值开始比较
}
int cmp(long long a,long long b)
{return a>b;
}
int dfs(int x,long long sum)
{if (x&#61;&#61;(n/2&#43;2)&#43;1){s[&#43;&#43;n_2]&#61;sum;//新的权值出现,压入数组中return true;//返回必不可少,否则RE}dfs(x&#43;1,sum);//不放这个进去if (sum&#43;a[x]<&#61;m)//可以放进去dfs(x&#43;1,sum&#43;a[x]);
}
int dfs2(int x,int sum)
{
// cout<if (x&#61;&#61;n&#43;1){find(sum);//求出当前可以填充的最大值return true;} dfs2(x&#43;1,sum);if (sum&#43;a[x]<&#61;m)//如果可以放进去dfs2(x&#43;1,sum&#43;a[x]);
}
int main()
{ios::sync_with_stdio(false);cin>>m>>n;for(int i&#61;1; i<&#61;n; i&#43;&#43;)cin>>a[i];sort(a&#43;1,a&#43;1&#43;n,cmp);//从大到小排序dfs(1,0);sort(s&#43;1,s&#43;n_2&#43;1);n_2&#61;unique(s&#43;1,s&#43;n_2&#43;1)-(s&#43;1);//去掉重复后,多少个数dfs2(n/2&#43;3,0);cout<<ans<<endl;return 0;
}


推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
我爱投资理财
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有