网上看到说这题还能用卡特兰数解,有兴趣的可以取搜搜。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2067
题意:
给出一个矩阵,不能穿越对角线,但可以触碰到,问从a[1][1] 走到 a[n][n]又多少种方法。
分析:
我们首先考虑a[n][n],a[n][n]可以从a[n-1][n]和a[n][n-1]两种状态得到,但是因为不能穿越对角线,所以我们只考虑一半的情况,然后根据对称性来得到最终的结果。
对角线上的点那么a[i][i]就只能从a[i][i-1]得到这是一种特殊情况, dp[i][i] = d[i][i-1]
其他点则可以是 dp[i][j] = dp[i][j-1] + dp[i-1][j]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 40;
typedef long long LL;
LL a[N][N];
int main()
{
int n;
int cnt = 1;
while(scanf("%d", &n), n != -1)
{
for(int i=0; i<N; i++)
{
a[i][0] = 1; // 棋盘边上的点只有一条路径
a[0][i] = 1;
}
for(int i=1; i<N; i++)
{
for(int j=1; j<i; j++) // 只考虑对角线一边的情况
{
a[i][j] = a[i-1][j] + a[i][j-1];
}
a[i][i] = a[i][i-1]; // 对角线上的点只能从它的下方得到
}
// a[n][n] = a[n][n-1];
// 根据对称性,最后的结果×2即可
printf("%d %d %lld\n", cnt++, n, 2 * a[n][n]);
}
return 0;
}