您的位置:首页 > 其它

HDU_2067 小兔的棋盘(DP)

2015-06-27 11:19 447 查看
题目请点这里

题解:

这道题目要求不能穿过对角线,而上下的情况是一样的。我们可以仅考虑一边,是一道动态规划的题目。从画图可以看出,当格点不再对角线上时可以从上方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

*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];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp