sicily 1527. Tiling a Grid With Dominoes


方法如下

二維數組dp[n][m]表示有n列且該列狀態爲m的時候的排列方法數。m用四位二進制表示,第a位表示該列第a行的狀態,1已經覆蓋,0表示沒有被覆蓋。初始狀態爲:

dp[1][3]=dp[1][6]=dp[1][12]=dp[1][15]=dp[1][0]=1;

狀態轉移:

    dp[t][15]=dp[t-1][15]+dp[t-1][12]+dp[t-1][3]+dp[t-1][6]+dp[t-1][0];
    dp[t][
9=dp[t-1][6];
    dp[t][
12]=dp[t-1][15]+dp[t-1][3];
    dp[t][
3=dp[t-1][15]+dp[t-1][12];
    dp[t][
6=dp[t-1][15]+dp[t-1][9];
    dp[t][
0=dp[t-1][15];

 代碼:

// Problem#: 8223
// Submission#: 2127308
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std ;
 
int main()
{
    int d[31][16] ;
    memset(d,0,sizeof(d)) ;
 
    d[1][15] =  d[1][12] = d[1][6] =  d[1][3] =d[1][0]= 1 ; 
    for(int i = 2 ; i <= 30 ; i ++)
    {
        d[i][15] = d[i-1][0]+d[i-1][3]+d[i-1][6]+d[i-1][12]+d[i-1][15] ;
        d[i][12] = d[i-1][3] + d[i-1][15] ;
        d[i][9] = d[i-1][6] ;
        d[i][6] = d[i-1][15] + d[i-1][9] ;
        d[i][3] = d[i-1][15] + d[i-1][12] ;
        d[i][0] = d[i-1][15] ;
    }
    int k = 1 ; 
    int n ;cin >> n ;
    while(n--)
    {
        int c ;
        cin >> c ;
        cout << k++ <<" " << d[c][15] << endl; 
    }
}                                 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章