- 题目大意
中文题,寻找从起点(0,0)走到终点(n,n)且不穿过对角线的最短路径数。
- 解题思路
利用卡特兰数,地图上的点满足num[i] += num[j] * num[i - j - 1],最后卡特兰数乘2就是答案了。
- 代码
#include<iostream> #include<cstring> using namespace std; const int MAX = 36; long long num[MAX]; void find() { memset(num, 0, sizeof(num)); num[0] = num[1] = 1; for (int i = 2; i <= 35; i++) for (int j = 0; j<i; j++) { num[i] += num[j] * num[i - j - 1]; } } int main() { int n; int a = 1; find(); while (cin >> n) { if (n == -1) { break; } cout << a++ << " " << n << " " << 2 * num[n] << endl; } return 0; }