卡尔文球锦标赛

真实讨厌10000n2的题目。。。

首先这道题目要明白是怎么按照字典序排序的。由于球队都是按照球队里面最小编号的人排序的,我们就从小到大地考虑每个人在哪一支球队。对第i个人来说,他可以加入之前的一个球队(此时之前要出现过这支球队),也可以新组建一支球队(此时新组建的这个球队的编号是之前球队最大编号加一)

但是现在还是没有什么思路,于是我们像装饰围栏这道题目一样直接先尝试用试填法:假设我们当前考虑到了第i位,我们枚举第i位的数字是什么,假设是j

j<ai时,注意题目给的序列一定是合法的,也就是说ai要么等于maxk=1i1ak+1,要么属于[1,maxk=1i1ak],那么我们只用考虑:剩下的ni个人,第一个人可以填[1,maxk=1i1ak+1]的所有合法的序列个数

j=ai时,我们接着往下面考虑就好了

按照以上想法,不难设计出状态:f[i][j]表示有i个人,第一个人可以填的数字为[1,j]的总方案数。注意此时表示前面已经填了的数字为[1,j1],所以有f[i][j]=(j1)×f[i1][j]+f[i1][j+1],前面的乘积项表示第一个人填的数字为[1,j1],后面的一项表示第一个人填的数字为j

这里肯定要用滚动数组优化。如果只是求出f,那么普通的滚动数组优化就好了,然而我们求数组的方向与用数组的方向却不一致。就是说,假设我们在试填中(这里滚动数组优化,肯定必须边试填边求f)让i1开始逐渐增大到n,那么我们当前求的是f[i],用的确实f[ni],这肯定就没有办法;于是我们必须要让两者方向一致,由于是DP数组在滚动,所以我们方便“用”的一方。具体见代码。注意,代码中f[j]=((ll)(j-1)*f[j]+f[j+1])%p;求的f[j]表示的是f[ni+1][j]

posted @   最爱丁珰  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示