Leetcode 1359. Count All Valid Pickup and Delivery Options [Python]

题目的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的对,这样的插入方式有(2
n-1)+ (2
n-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值