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