hdoj 2046 骨牌鋪方格(遞推)
阿新 • • 發佈:2019-02-19
在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;
}
}