Jzoj5441【NOIP2017提高A组冲刺11.1】序列

该博客探讨了一道编程竞赛题目,涉及序列翻转以达到升序排列的最少操作次数问题。博主经历了尝试贪心算法失败,暴力求解得零分的过程,最终找到了迭代加深搜索结合剪枝的解决方案。深度上限设定为2n-2,估价函数f(S)用于判断当前状态是否可能导致超过步数上限,从而进行有效的剪枝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个1~n的排列x,每次你可以将x1~xi翻转。你需要求出将序列变为升序的最小操作次数。有多组数据。

此题十分不友善

对于多年没有打过搜索的蒟蒻更是如此

(强行)假定这个题数据范围是在坑人(因为我以前真的见过有人二分图匹配的题正解是状压DP的)

开始寻找多项式算法。。。。。

发现各种贪心都不行。。。。。

实在不行开始写暴力,最后挂掉0分


说说正解:迭代加深+剪枝

我们考虑两个东西,深度上限:2n-2 这个非常显然(其实还有一种说法是上界为n但是没有人证明)

估价函数f(S),表示S到结果至少需要多少步

我们令 f(S)=Σ[abs(S[i]-S[i+1])>1]+已用的步数和步数上限做比较如果大于直接退出

实现f非常简单,我们考虑为什么这样是对的

从各种贪心和样例来看,我们发现若干个连续的数字在最优解中肯定不会被破坏(误,其实我也不知道为什么)

引用题解:

我们发现每次翻转只会改变一对相邻数对,因此对于一个状态求出相差>1 的相邻数对的数量,剩余步数一定大于这个值。加上这个剪枝就能通过本题。

假装这个是显然的,我们就可以迭代加深了

700ms+,十分菜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值