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;
	}
}