1834. 分组选项(复杂)

1834. 分组选项

中文English

现在有nn个人在排成一排。他们必须从左到右分成连续的mm组。如果每个组的人数都必须大于等于其左边的组的人数,请问一共有多少种不同的分组方式。对于两个分组而言,当且仅当按递增序排列以后是不同的,他才是不同的分组。例如,[1, 1, 1, 3][1, 1, 1, 2]不同,但和[1, 3, 1, 1]相同。

样例

Input:
8
4
Output: 5
Explanation: [1, 1, 1, 5], [1, 1, 2, 4], [1, 1, 3, 3], [1, 2, 2, 3], [2, 2, 2, 2]

注意事项

1 \leq n,m \leq 2001n,m200

输入测试数据 (每行一个参数)如何理解测试数据?

 

class Solution:
    """
    @param n: the number of people
    @param m: the number of groups
    @return: the number of grouping options
    """
    '''
    大致思路:
    1.首先先判断,将可以直接得的直接返回
    2.f[i][j] = f[i][j] + f[i - j][1] + f[i - j][2] + ... + f[i - j][m] 转移方程
    '''
    def groupingOptions(self, n, m):
        if m > n:return 0 
        
        #
        f = [[0]*(n + 1) for _ in range(n + 1)]
        #如果m和n相等的话,就赋值1
        for i in range(n + 1):
            f[i][i] = 1
        
        #计算顺序
        for i in range(2, n + 1):
            for j in range(1,i):
                for k in range(1,j + 1):
                    f[i][j] = f[i][j] + f[i - j][k]
        
        return f[n][m]

 

posted @ 2020-06-13 16:41  风不再来  阅读(339)  评论(0编辑  收藏  举报