bluecode-套碗游戏的取碗顺序问题(二)

27 阅读1分钟

问题描述

小F正在玩一个套碗的游戏,每个碗都有一个编号,从1到n,它们从大到小被套在一根木棍上。小F只能从木棍上取最上面的碗,每次只能取一个。现在你需要计算总共有多少种取碗的顺序。

例如,对于2个碗,取碗的顺序可以是 2 1 或 1 2,这两种顺序都是合法的。而对于3个碗,给定顺序 3 1 2 不可能通过合法操作实现,因此该顺序不可行。


测试样例

样例1:

输入:M = 2
输出:2

样例2:

输入:M = 3
输出:5

样例3:

输入:M = 4
输出:14

卡特兰数

#include <iostream>
#include <vector>
#include <string>

using namespace std;

long long solution(int M) {
    vector<long long> dp(M + 1, 0);

    dp[0] = 1;
    for(int i = 1; i <= M; ++i){
        for(int j = 0; j < i; ++j){
            dp[i] += dp[j] * dp[i - 1 - j];
        }
    }

    return dp[M];
}

int main() {
    std::cout << (solution(2) == 2) << std::endl;
    std::cout << (solution(3) == 5) << std::endl;
    std::cout << (solution(4) == 14) << std::endl;

    return 0;
}