题目的hint贼给力。给定n个(p,d)的对。如何排列呢?
n = 1: 只能是p1,d1
n = 2: 相当于把p2,d2插入到 n=1时的序列里,因为n=1只有一种排列,_ ,p1,_d1,_
p2 _ ,p1,_d1,_当p2在最前面时,d2可以放入三个下划线所在的空;同理当
p1,p2,_d1,_ p2在p1后面时,d2可以放两个空,最后,p1d1p2_p2在最
后,d2只能放最后。所以放置方式是3+2+1种。同时,n=1的时候的排列只
一种,所以是(3+2+1)1 = 6
n = 3: 把p3 d3放入到n=2的某一个序列中,假设为 _p1,_d1,_p2,_d2_.可以得到一共有5 个空位,当p3在最前面,d3有5个位置可以放p3,_p1,_d1,_p2,_d2_.当d3往后位置放的,则d3有4,3,2,1种放置方式。所以有5+4+3+2+1对应一种n=2时的序列,而n=2一共有6种序列,所以n=3的序列是(5+4+3+2+1)6。
。。
所以可以推理得到,当n给定时,其等于在n-1的某一个序列里插入一个新的pd的对,这样的插入方式有(2n-1)+ (2n-2)+ 。。。+ 1种。然后,需要n-1时候的总的排列方式。所以,用dp【i】表示n=i时,总共的排列方式。dp【i】 = sigma(2n-1) *dp【i-1】
class Solution:
def countOrders(self, n: int) -> int:
Mod = 10**9 + 7
dp = [0 for _ in range(1+n)]
dp[1] = 1
for i in range(2, n+1):
start = ((i-1)*2 + 1)
cum = 0
while start != 0:
cum += start
start -= 1
dp[i] = cum*dp[i-1]
return dp[-1]%Mod
#start sequence = ((n-1)*2 + 1)
#n = 1 1
#n = 2 3 + 2 + 1 * p[1] = 6* 1 = 6
#n = 3 5 + 4 + 3 + 2 + 1 * P[2] = 15*6 = 90