Loading

P13586 [NWRRC 2023] First Solved, Last Coded

是个美难题!让我对栈结构有了新的理解。

我们对于栈,可以想到深度优先搜索,dfs 树等。。。总之都是说明了栈有着优良的性质,当然关于前缀和等的数学性质就不多说了,毕竟对这道题理解作用不大。

这题看起来很难,先找切入点。注意到数据范围很小,我们可以想到结合栈的优良性质去干一些事情。考虑从第一个入栈的东西的出栈时间入手,或者从最后一个出栈的东西枚举入栈的时间入手,我是从后者考虑的。

对于最后一次出栈的数,如果其是第 \(i\) 个入栈的,则需要满足社么条件?发现对于 \([i+1,n]\) 这些入栈的数需要被 pop 干净,并且自己本身不能被 pop 出去,由于自己前面的数被 pop 只有两种可能,一种是自己没进来的时候被 pop,要么是自己被 pop 后前面被 pop,稍微分析一下就能够发现我们其实进入了两个子问题,因为前面得先全 pop 掉,\(i\) 加入之后的所有数要在只后全 pop 掉,及对于出栈序列 \([1,i-1]\) 和入栈序列 \([1,i-1]\) 需要自己处理组成合法栈序列,对于出栈序列 \([i,n-1]\) 和入栈序列 \([i+1,n]\) 需要满足自己处理组成合法栈序列。

我们发现这样我们就进入了子问题,并且都是连续的区间,如果对栈很熟悉的话,这并不意外,这题也说明了栈能跟一些奇奇怪怪的区间问题扯上关系。

那么我们发现状态不多,在可接受范围,于是直接 dp 就好了,设 \(f(i,j,l)\) 表示入栈序列左端点在 \(i\),出栈序列左端点在 \(j\),长度都为 \(l\) 的子问题,转移简单枚举即可,最后利用搜索把方案搜出来就做完了。时间复杂度 \(\mathcal{O}(n^4)\)

posted @ 2025-09-30 15:11  lalaouye  阅读(8)  评论(0)    收藏  举报