蓝桥杯OJ240 排列数
MOD=123456n,k=map(int,input().split())#求k-1个折点
dp=[[*(k) for i in range(3) ]for j in range(n+1)]
dp=1
dp=2
dp=dp=2
dp=2
for i in range(4,n+1):
for j in range(3):
for t in range(0,min(k,i)):
dp+=dp*(t+1)
if t>=2:
dp+=dp*(i-t-1)#注意不是*(i-t-3)
if t>=1:
if j==0 or j==2: dp+=dp
if j==1: dp+=2*dp+2*dp
dp%=MOD
print((dp+dp+dp)%MOD) 构建一个dp数组,dp i代表一共i个数来排列。j代表3个状态。k代表k个折点。(代码中用dp表示,并没有什么意思,只是符号不敷用了。。。)
现在来分析三个状态:
j==0 代表wwwww的外形的序列,两端都是较大值
j==1 代表NNNNNNNNNNN的外形的序列,两端分别是较大值和较小值
j==2 代表mmmmmmmmmm的外形的序列,两端都是较小值
如图所示:https://i-blog.csdnimg.cn/direct/ba9f95ce1e934161bf7d1c08ef42001d.bmp
然后分别讨论dp的递推关系https://i-blog.csdnimg.cn/direct/3b89b3157383468c95c6a6a4362de406.jpeg
前面的红笔写的是递推时要乘上的系数
然后再整理一下就能得到代码中的递推公式了~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]