今天也不知道咋了,做题晕晕乎乎的,三个人出了C题之后我开始做C题,本来觉得挺简单的一道题,感觉我写的一点毛病也没有,就一直WA,还WA在同一组。我换了两种做法做的都WA。后来我实在看不出来了,就让队友帮我看了一眼,才发现我的边界条件有问题,就把最后一种的改了,交上去过了。结束了之后我又开始改我最开始的代码,改了好久,发现也是边界问题。两个代码错在同样的地方,真的是长记性了,以后一定得好好控制边界条件,别少情况。
D题我开始读错了题,以为用b-l剩下的区间成立就可以,但是搞了半天没搞懂第一组样例是怎么出来的,后来才发现,是要求最小的l,是长度为l的子串都可以包含至少k个素数。也是卡了好几遍在判断条件上。今天不知道咋了,就是跟边界条件杠上了。
今天白天看了深搜,剪枝和迭代加深。
一、深度优先搜索(DFS)
深搜优先搜索就是按照一条路径往下找,找到叶子节点还找不到就返回上一节点,继续往下找,直到找到为止。
二、剪枝
1.优先搜索顺序;
2.排除等效冗余:
如果沿不同分支到达的子树是等效,则只需要对其中一条进行检索。
3.可行性剪枝:
及时对当前状态进行检索,如果发现分支已经无法到达递归边界,就执行回溯。
4.最优性剪枝
如果当前花费的代价已经超过了当前所求最优解,就不再继续最当前分支进行搜索,直接回溯。
5.记忆化
记录每一个状态的搜索结果,再重复遍历一个状态时直接检索并返回。
三、迭代加深
如果一个树中目标状态之前的字树很深,而目标状态深度很浅,如果从头开始遍历,就会浪费很多时间。
我们可以从小到大限制搜索深度,如果在当前深度搜索不到答案,就逐渐把深度增加,重新进行搜索。
四、双向搜索
从初态和终态出发各搜索一半状态,产生两棵深度减半的搜索树,在中间交汇、组合成最终的答案。