题目请点这里
题解:
这道题目要求不能穿过对角线,而上下的情况是一样的。我们可以仅考虑一边,是一道动态规划的题目。从画图可以看出,当格点不再对角线上时可以从上方dp[i-1][j]以及左方dp[i][j-1]两个格点直接到达,而位于对角线上时,由于不能穿过对角线,只能从一边到达。所以得到状态方程:
dp[i][j] = dp[i][j-1];(i = j)
dp[i][j] = dp[i][j-1]+dp[i-1][j];(i != j)
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 40
#define LL long long
using namespace std;
LL dp[MAX][MAX];
int N,key;
void pre();
int main(){
key = 1;
pre();
while( scanf("%d",&N) && N != -1 ){
printf("%d %d %I64d\n",key,N,dp[N][N]*2);
key++;
}
return 0;
}
void pre(){
memset(dp,0,sizeof(dp));
for( int i = 0; i < MAX; i++ ){
dp[i][0] = 1;
}
for( int i = 1; i < MAX; i++ ){
for( int j = 1; j <= i; j++ ){
if( i == j ){
dp[i][j] = dp[i][j-1];
}
else
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}