问题描述
小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;
}