卡尔文球锦标赛
真实讨厌\(10000\)过\(n^2\)的题目。。。
首先这道题目要明白是怎么按照字典序排序的。由于球队都是按照球队里面最小编号的人排序的,我们就从小到大地考虑每个人在哪一支球队。对第\(i\)个人来说,他可以加入之前的一个球队(此时之前要出现过这支球队),也可以新组建一支球队(此时新组建的这个球队的编号是之前球队最大编号加一)
然后我们就可以按照数位DP写了,假设我们当前考虑到了第\(i\)位,我们枚举第\(i\)位的数字是什么,假设是\(j\)
当\(j<a_i\)时,注意题目给的序列一定是合法的,也就是说\(a_i\)要么等于\(max_{k=1}^{i-1}a_k+1\),要么属于\([1,max_{k=1}^{i-1}a_k]\),那么我们只用考虑剩下的\(n-i\)个人,如果每一个人都可以填\([1,max_{k=1}^{i-1}a_k+1]\)的所有合法的序列个数
当\(j=a_i\)时,我们接着往下面考虑就好了
用滚动数组优化即可
提一个代码的细节。我们讲解的时候是让\(i\)正序循环,但是写代码的时候要让\(i\)倒序循环,因为我们必须滚动数组优化DP数组,而我们如果正序循环,我们(没有滚动优化)的DP数组的第一维是在逐渐减小的,这就要求我们不能滚动数组优化。我们从形式上考虑,即使我们倒序循环\(i\),最终的答案也不变(指的是倒序循环每一次\(ans\)更新的时候,一定会对应正序循环某一次\(ans\)更新的时候),所以不影响正确性