暑期题单新知识——启发式优化

AF

暑假一道图论题,本来写着A,B两题的dfs和bfs,本着不浪费(刚写的dfs和bfs的AC代码)的原则,就直接想写代码

主要是因为

↓↓↓↓↓↓↓↓↓↓

image

正常电脑一秒5e7

可……

{D4FD5A95-1244-46A4-9E76-187DA8CB2A51}

也就是O((64)³)都可以跑出光速(故意的,因为打不出4次方)

好了,此篇完结:party_popper::party_popper::party_popper:

不是哥们,你倒是写个O((64)³)的代码呀

没错,写不出来

别急,先看这个—> 哈密尔顿路径

如果你写正常代码………………

千奇百怪の死法

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

死亡回放1

暴搜,直接考虑每一个点的到达顺序,因为第i个点有(64-i+1)种可能,所以直接O(64!),还要考虑检查结果是否合理,这个的方法很多,但……

{6FA94E38-CA47-4B75-8C6C-1F2DA9C082B9}

— ↓↓ —

总结

三体人来算,算完地球人都亖完了

死亡回放2

众所周知的dfs,对于每个点,都有8种可能性,所以n = 64,时间复杂度O(8ⁿ),但有些点可能在前面走过所以最终的时间复杂度会略微小一点

{C92C8A24-B0B6-45E3-A216-E6280F1A2A34}

— ↓↓ —

总结

你让 神威·太湖之光 来,都得吃不了兜着走

死亡回放3

3.好用的bfs,但这里貌似不管用,因为只能走一次,比较难写,但时间复杂度和dfs差不多

— ↓↓ —

总结

一群没有用处的FW,学你们有什么用,还有谁!!!

到底怎么写!!!!!!

这道题就是一个哈密瓜炖路径

动用一下人类智慧,考虑对于仅需一个正解就行的题目,有很多不必要的计算是冗余的

记得优先队列优化最短路吗?和它没关系。

其实用一个启发式优化 就可以了

给一下AC代码碎片

for (int i = 0; i < 8; i++) 
{
    int nx = x + dx[i],ny = y + dy[i];
    if (mc(nx, ny)) //move_check,检查是否可以移动
	{
        next.push_back({count(nx, ny), i});
    }
}
// 按可选移动数升序排序(启发式优化)
sort(next.begin(), next.end());
for (auto& p : next) 
{
    int i = p.s;
    int nx = x + dx[i], ny = y + dy[i];
	if (solve(nx, ny, move + 1)) //动一动
		return true;
}//next是个vector

其实说白了就是给机会少的点传递(其实我也不知道优化了哪里,就跟线段树的懒标记一样,其实最坏跟没写是差不多的)

实战

image

不过既然写了题,就写篇帖子记录一下,下次就不用再……

花2小时调代码,2小时找正解了

有兴趣的童鞋可以看看这道题

image

以此记录一个新知识点的诞生

不知道的人可以洛谷私聊,帖子下面回复也行,上初中,暑假没作业

洛谷名:Pyyxwhy

点个赞再走,求求了!!!

3 个赞

太好了!

\LaTeX $O((64)^4)$O((64)^4)

O((64)^4),好小子,记下来了

O(64^4)
应该这样

:sweat_smile::sweat_smile::sweat_smile:

怎么能给自己解决啊

对啊对啊

不好意思,点回复点错了

https://discourse.xinyoudui.com/t/topic/40504

建议看一下