刎唇 发表于 2025-6-7 10:20:48

P1220 关路灯 搜索剪枝

题目链接:
https://www.luogu.com.cn/problem/P1220
在搜索题单里第一次看到这种题目被吓住了
和之前我刷过的搜索题(全是板子)比,这里需要不断地朝不同方向搜索
并且让人汗流浃背的是1≤n≤50,爆搜肯定是炸了.
考虑这三个点
1.如何去遍历左右节点
2.记录状态的方案
3.怎么去优化节点搜索方案
1.遍历方法:
在每次搜索的时候选择左右两边遍历相邻顶点并且需要确保不越界
for(int i = 1;i<=n;++i){
//当前的位置
int _pos = (pos +- i);
//判断位置的合法性
_pos >= 1(向左)_pos <= n (向右)
//~~更新状态~~
}做到这里,你只能得40分,因为还有一个点没优化
在遍历的过程中一旦确定了节点就说明当前节点没有实际用处了.
所以在dfs还原现场后退出for循环就行了
AC代码
#includeusing namespace std;using ll = long long;const int inf = INT_MAX;const int N = 55;int T;int n,k;int ans = inf;int a,v;bitsetvis;int sum = 0;//现在的端点,关掉的灯的总数,走路时间,剩余的功率,耗电量void dfs(int pos,int closed,int _time,int cost,int _sum){    if(_sum + cost * _time >= ans)return;    if(closed == n){      ans = min(ans,_sum);      return;    }    for(int i = 1;in>>k;    for(int i = 1;i>a>>v;      sum += v;    }    vis = 1;    dfs(k,1,0,sum - v,0);    cout

僻嘶 发表于 2025-11-19 17:54:38

过来提前占个楼

章娅萝 发表于 2025-12-9 20:17:44

喜欢鼓捣这些软件,现在用得少,谢谢分享!

染悄 发表于 2025-12-27 22:04:16

东西不错很实用谢谢分享

祝安芙 发表于 2025-12-30 21:56:57

感谢分享

丘娅楠 发表于 2026-1-6 12:14:00

懂技术并乐意极积无私分享的人越来越少。珍惜

阎一禾 发表于 2026-1-17 16:06:18

感谢分享

任娅翠 发表于 2026-1-18 10:30:16

yyds。多谢分享

薛小春 发表于 2026-1-20 21:59:36

感谢,下载保存了

左丘平莹 发表于 2026-1-21 06:04:19

鼓励转贴优秀软件安全工具和文档!

柯惠心 发表于 2026-1-25 10:59:52

收藏一下   不知道什么时候能用到

石娅凉 发表于 2026-1-28 07:26:19

谢谢楼主提供!

静轾 发表于 2026-1-30 06:49:11

懂技术并乐意极积无私分享的人越来越少。珍惜

师悠逸 发表于 2026-2-3 06:57:18

分享、互助 让互联网精神温暖你我

恿深疏 发表于 2026-2-3 08:01:56

感谢,下载保存了

季卓然 发表于 2026-2-8 04:50:00

分享、互助 让互联网精神温暖你我

百杲憔 发表于 2026-2-8 13:40:14

鼓励转贴优秀软件安全工具和文档!

孜尊 发表于 2026-2-9 17:53:32

用心讨论,共获提升!

司马黛 发表于 2026-2-10 05:06:05

这个有用。

押疙 发表于 2026-2-10 16:21:09

这个好,看起来很实用
页: [1] 2
查看完整版本: P1220 关路灯 搜索剪枝