0158 字典序字符串
* * * *
拉格朗日计划
* * * *
字典序字符串

从字母表的26个小写字母中取三个不同的字母,可以组成一个长度为3的字符串,例如abc、hat、zyx等等。

字典序是按照字母在字典中出现的顺序形成的排序,在字典中先出现的字母的字典序小,例如a小于c。

在字符串abc中,有两个字符的字典序比其左侧相邻的字符大。在字符串hat,只有一个字符的字典序比其左侧相邻的字符大与其左侧字符是按照字典序升序排列的,而在字符串zyx则不存在这样的字符。

在所有长度为3且由互不相同的小写字母组成的字符串中,共有10400个字符串中恰有一个字符的字典序比其左侧相邻的字符大的字符串。

用$p(n)$表示由互不相同的小写字母组成的、长度为n、且其中恰有一个字符的字典序比其左侧相邻的字符大的字符串的总数,求$\max_{1\le n\le 26}p(n)$。

本题难度:



解答

令$q(n)$为由前n个字母组成的、长度为n且恰有一个字符的字典序比其左侧相邻的字符大的字符串总数。则显然$q(1)=0$、$q(2)=1$,且 $$q(n)=2q(n-1)+n-1.$$ 这是因为若把这n个字母按升序记作$a_1,\ldots,a_n$,那么首先考虑字符串$a_{n-1}\ldots a_{1}$,把$a_n$插入到其中任意一个字母之后都可得一个满足要求的字符串,共有n-1个位置可以插入。

其次若$a_1'\ldots a_{n-1}'$是一个由前$n-1$个字母组成的、满足要求的字符串,那么可以从某个位置k'处将其分成两部分: $a_1'\ldots a_{k}'$和$a_{k+1}'\ldots a_{n-1}'$,这两个子串都递减且$a_{k+1}'>a_{k}'$,从而把$a_n$插入到$a_1'$或$a_{k+1}'$之前都可以得到一个长度为n的满足要求的字符串。

递推计算$q(n)$以及 $$p(n)=q(n)\cdot \binom{26}{n}.$$ 可得结果为$p(18)=409511334375$。

import math

q=[0,0]

for i in range(2,27):
    q.append(2*q[-1]+i-1)

print(max([q[i]*math.comb(26,i),i]for i in range(1,27)))