PKU2663 Tri Tiling

PKU2663 Tri Tiling
简单的DP,好像NOIP之前就做过这样的题。
这次仍然是很暴力的转移。。(好像我比较喜欢这个,省脑子。)

PKU2663
 1/**//*
 2Task: pku2663
 3Author: DMKaplony
 4Date: 03/03/2010 14:41:52 China Standard Time
 5State: Finish @ 03/03/2010 14:50:14 China Standard Time
 6    6507229    DMKaplony    2663    Accepted    164K    0MS    C++    948B    2010-03-03 14:50:26
 7Memo: DP--Forxcc0322
 8*/

 9
10#include <iostream>
11
12using namespace std;
13
14int f[2][8];
15int n;
16
17int main(){
18    while (1){
19        scanf("%d"&n);
20        if (n == -1)
21            break;
22        memset(f, 0sizeof(f));
23        f[0][7= 1;
24        int last7 = 0;
25        for (int i=1; i<n+1; i++){
26            f[i & 1][1= f[i - 1 & 1][6];
27            f[i & 1][2= f[i - 1 & 1][5];
28            f[i & 1][3= f[i - 1 & 1][4];
29            f[i & 1][4= f[i - 1 & 1][3+ f[i - 1 & 1][7];
30            f[i & 1][5= f[i - 1 & 1][2];
31            f[i & 1][6= f[i - 1 & 1][1+ f[i - 1 & 1][7];
32            f[i & 1][7= f[i - 1 & 1][4+ f[i - 1 & 1][6+ last7;
33            last7 = f[i - 1 & 1][7];
34            }

35        printf("%d\n", f[n & 1][7]);
36        }

37    return 0;
38    }

39



我认为我这个是纯粹的省时省心省脑的方法(话说last7还是后来加上去的)。
其实有更为精妙的数学方法:
【引用PKUDiscuss:
Posted by denghongchao at 2009-08-14 18:43:58 on Problem 2663
先假设没2竖为1 单位。
对当前解a[i] ,有
1.在此处放一单位的积木。等于a[i-1]*3;
2.与前面相连接。连接的方案有 2 * (a[i-2] + a[i-3] +......+a[0]);
a[i] = 3*a[i-1] + 2*(a[i-2] + a[i-3] +......+a[0]);
a[i-1] = 3*a[i-2] + 2*(a[i-3] + a[i-3] +......+a[0]);
a[i-1] - a[i-2] = 2*(a[i-2] + a[i-3] +......+a[0]);

解得a[i] = a[i-1] * 4 - a[i-2];
至于为何要a[0] = 1,从公式中就可看到因为要一直取到最前面一个单位。这时也有2种情况。故a[0] = 1 能从理论上运算。。。。这是我的理解,见笑了。

话说我还没怎么懂这个公式。。。

你可能感兴趣的:(PKU2663 Tri Tiling)