转载于https://www.cnblogs.com/chaosheng/archive/2012/01/26/2329576.html
缘由
今天写hdu2067的时候,没有思路,便搜了一下题解,结果大多数题解都看不懂(不会卡特兰数),最后在这篇题解上弄懂了这道题,于是想记录一下
题目大意
找到不穿越对角线到达(n,n)点的路径数
思路——递推
既然不能穿越对角线,那么可以将棋盘按对角线分成左右2个三角形,只需计算其中一个三角形的路径,然后将结果乘2即可
我们选择左三角形研究,观察得知,棋盘上各点都只能从左方棋格或者上方棋格到达,且0列上的棋格都只能从上方到达,故到达0列上的棋格最短路径都只有1条,而对角线上的棋格只能从左方到达(在左三角形中)
代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
long long dp[40][40];
int main()
{
int n, flag = 0;
for (int i = 0; i < 40; i++)
dp[i][0] = 1; //0列上的棋格都只能从上方到达
for (int i = 1; i < 40; i++)
for (int j = 1; j <= i; j++) {
if (i == j)
dp[i][j] = dp[i][j - 1]; //对角线上的棋格只能从左方到达
else
dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; //其余棋格可从左方棋格或者上方棋格到达
}
while (cin >> n && n != -1) {
cout << ++flag << " " << n << " " << 2 * dp[n][n] << endl;
}
return 0;
}