骨牌铺方格
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33887 Accepted Submission(s): 16424
Problem Description
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

Input
输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。
Output
对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。
Sample Input
1 3 2
Sample Output
1 3 2
Author
lcy
题目分析:初始dp[0]=1,转移方式有两种,竖着放dp[i]+=dp[i-1],还有横着放,dp[i]+=dp[i-2],会超int,注意
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAX 57
using namespace std;
int n;
long long dp[MAX];
int main ( )
{
while ( ~scanf ( "%d" , &n ) )
{
memset ( dp , -1 , sizeof ( dp ) );
dp[0] = 1;
for ( int i = 1 ; i <= n ; i++ )
for ( int j = n ; j >= 1 ; j-- )
if ( j-2 >= 0 )
dp[j] = max ( dp[j] , dp[j-1] + dp[j-2] );
else if ( j-1 >= 0 )
dp[j] = max ( dp[j] , dp[j-1] );
printf ( "%lld\n" , dp[n] );
}
}