1. 程式人生 > >hdoj 2046 骨牌鋪方格(遞推)

hdoj 2046 骨牌鋪方格(遞推)

在2×n的一個長方形方格中,用一個1× 2的骨牌鋪滿方格,輸入n ,輸出鋪放方案的總數.

思路: 兩種情況:

         情況 1: 在長方形方格末尾豎著放一個牌, 就轉化為2*(n-1)的問題; 

         情況2 : 在長方形方格末尾橫著放兩個牌,( 或則在放兩張豎著放的牌, 但是由於情況1中包含這種情況, 因此不再計算), 就轉化為2*(n-1)的問題;

         遞推關係式: dp[n]=dp[n-1]+dp[n-2];
#include<iostream>
using namespace std;
int main()
{
    int
n; long long dp[52]; dp[1]=1; dp[2]=2; for(int i=3; i<=51; i++) dp[i]=dp[i-1]+dp[i-2]; while( cin>>n ) cout<<dp[n]<<endl; }

擴充套件一下: 在1×n的一個長方形方格中,用1×1、1×2、1×3的骨牌鋪滿方格,輸入n
,輸出鋪放方案的總數

遞推式: dp[i]=dp[i-1]+dp[i-2]+dp[i-3];這也很好理解

#include<iostream>
using namespace std; int main() { int n; long long dp[3000]; dp[0]=1; dp[1]=1; dp[2]=2; while( cin>>n &&n ) { if( n>2 ) { for(int i=3; i<=n; i++) dp[i]=dp[i-1]+dp[i-2]+dp[i-3]; } cout<<dp[n]<<endl; } }