首页 > 其他 > 详细

HDU1143(3*N的地板铺1*2的砖)

时间:2015-11-14 21:50:19      阅读:325      评论:0      收藏:0      [点我收藏+]

Tri Tiling

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3004    Accepted Submission(s): 1687

 

Problem Description
In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle.

技术分享
 
Input
Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer 0 ≤ n ≤ 30. 
 
Output
For each test case, output one integer number giving the number of possible tilings. 
 
Sample Input
2
8
12
-1
 
Sample Output
3
153
2131
 
Source
 
思路详见:动态规划
我的代码:
const int maxn = 40;

int dp[maxn][5];

void init() {
    dp[0][0] = dp[0][2] = 1;
    dp[0][1] = 0;
    dp[1][0] = dp[1][2] = 0;
    dp[1][1] = 1;
    for (int i = 2; i <= 30; i ++) {
        dp[i][0] = dp[i-2][0] + dp[i-1][1] + dp[i-2][2];
        dp[i][1] = dp[i-1][2];
        dp[i][2] = dp[i-1][1] + dp[i][0];
    }
}

int main() {
    int n;
    init();
    while (~scanf("%d", &n)) {
        if (n == -1) break;
        printf("%d\n", dp[n][0]);
    }
    return 0;
}

Discuss里的代码:

const int MAX=31;
int s[MAX];
int main()
{
    int i,n;
    s[0]=1;
    s[2]=3;
    for(i=4;i<MAX;i+=2)
    {
        s[i]=4*s[i-2]-s[i-4];
    }
    while(cin>>n,n>=0)
    {
        if(n&1)
            cout<<0<<endl;
        else
            cout<<s[n]<<endl;
    }
    return 0;
}

 

HDU1143(3*N的地板铺1*2的砖)

原文:http://www.cnblogs.com/LinKArftc/p/4965072.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!