o_o 当前时间是:

4:02:21 AM

 

CF1437F

好神奇的 dp 题。

description

给定数组 a,求其有多少个排列满足

  • yi=max(a1,a2,,ai1)

  • i[1,n]Z,2aiyi OR 2yiai

以下标区分排列。

solution

我们称一个排列中所有满足 2yiaii 为关键点。

a 数组排序,记 si 表示 a 数组中 ai2 的数的个数加 1。

fi 表示考虑前 i 个数,第 i 个数是关键点且所有 ai2 的数与 ai 本身都已经填好的方案数。

如果 2×an1>an,答案为 0;否则,根据状态定义,答案为 fn

这是本题状态设计很有意思的一点,状态本身不能表示所有情况的答案,但是我们可以直接回答其不能表示的情况的答案。

下面来转移:

  • f0=1

  • fi=j=0,aj×2aiAnsaj1saisaj1fj

考虑第二个转移式的意义。

我们枚举上一个关键点 j,那么根据状态定义,当前还有 nsaj 个位置,又因为 ai 一定放在 aj 后第一个没有填的位置(否则该位置不能填其他合法的数),所以还有 nsaj1 个位置不确定,我们要把 >aj2ai2 的除了 ajsaisaj1 个数填进去排列。(可以发现,所有空位一定在 ai 后边,所以可以放心地把这些数填进去)

特别地,j=0 时,系数为 An1sai1 正好也符合上述转移式。


感觉这个 dp 特别神奇,因为从正面去想总感觉哪里不对,但是仔细思考却可以发现其正确性。

code

Submission #228269315 - Codeforces

posted @   zzafanti  阅读(20)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示