ACM Puzzles - UVa 12117 dp

The Association of Children Machines (ACM) is planning to build up a new type of puzzle for children. All the puzzles will have dimension (3×N) and has some or all of the following pieces. Some pieces can occur more than once. Since the puzzles made by ACM are in very high demand so many other companies have released counterfeit products which look just like puzzles made by ACM.

 

Figure 1: The 22 allowed pieces of the puzzle.

 

To prevent such counterfeit products ACM has taken up a measure which they hope will help the sellers to prevent the counterfeit products in their shop. As all puzzles are initially available in a box in a solved format and a (3×N) puzzle can have zillions of solutions for larger values of N. All the puzzles from ACM factory will have only some specific solutions when sold; they will be unique and only small fractions of all possible solutions. So it is more likely that the counterfeit products won’t have these orientations. You have to help them in the initial part: given the value of N you will have to find how many different solutions are there with the given pieces. You are not allowed to rotate the pieces while solving the puzzle but you can use any piece any number of time. Of course some of the pieces are mere rotation of another but they also cannot be rotated to make it look like the other. For example the piece with shape upside down T (the brown piece) cannot be rotated to look like a normal T (the pink piece).

 

 

Figure 2: The 26 solutions for N=5
 
Input

The input file contains several lines of input. Each line contains an integer N (0<N<2001). Here N denotes the width of the puzzle. The height of the puzzle is always 3. Input is terminated by a line containing a single zero. This line should not be processed.

 

Output

For each value of N produce one line of output. This line contains the serial of output followed by an integer which denotes the value (S % 1000000000000). Here S denotes the number of solutions for a (3×N) puzzle. Look at the output for sample input for details.

 

Sample Input                            Output for Sample Input

5

100

0

Case 1: 26

Case 2: 584039302899

 



题意:3*N的矩阵有多少种铺成的方式。

思路:dp[i][j]表示第i列差j的情况的数目。

AC代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int num[9]={0,1,2,3,4,5,6,13,38};
ll dp[2010][70],MOD=1000000000000LL;
int main()
{
    int n,t=0,i,j,k;
    dp[0][0]=1;
    dp[1][0]=1;
    for(i=2;i<=2000;i++)
    {
        dp[i][0]+=dp[i-1][0];
        dp[i][5]+=dp[i-2][0];
        dp[i][0]+=dp[i-1][5];
        dp[i][0]+=dp[i-1][3];
        dp[i][5]+=dp[i-2][2];
        dp[i][2]+=dp[i-2][0];

        dp[i][0]+=dp[i-1][2];
        dp[i][1]+=dp[i-1][13];
        dp[i][4]+=dp[i-1][38];
        dp[i][1]+=dp[i-1][3];
        dp[i][4]+=dp[i-1][6];
        dp[i][1]+=dp[i-2][0];

        dp[i][0]+=dp[i-1][6];
        dp[i][3]+=dp[i-2][0];
        dp[i][0]+=dp[i-1][4];
        dp[i][13]+=dp[i-2][3];
        dp[i][38]+=dp[i-2][6];
        dp[i][6]+=dp[i-2][0];

        dp[i][0]+=dp[i-1][1];
        dp[i][3]+=dp[i-2][4];
        dp[i][6]+=dp[i-2][1];
        dp[i][4]+=dp[i-2][0];

        for(j=0;j<9;j++)
           dp[i][j]=dp[i][j]%MOD;
    }
    while(~scanf("%d",&n) && n)
       printf("Case %d: %lld\n",++t,dp[n][0]);

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值