hdu 2232 矩阵 ***

一天四个不同的机器人a、b、c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同一条边视为临近)的一个毯子移动或停留在原来的毯子(同一块毯子可以有多个机器人停留),这个时 候机器人的制造者你想知道经过n步的移动有多少种方式可以让每个毯子上都有机器人停留。

 

dp[i][j][k]表示在第i步时,从j走到k的方案数

那么在第i+1步时从j走到k再走到k1的步数即为dp[i]*dp[1]

写出dp[1]求出dp[i],然后乱搞一下即可

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 9937
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=1005;
16 int n,m,tt;
17 ll a[4][4]=
18 {
19     1,1,0,1,
20     1,1,1,0,
21     0,1,1,1,
22     1,0,1,1
23 };
24 ll dp[105][5][5];
25 void init()
26 {
27     ll k,l,i,j;
28     for (k=1;k<102;k++)
29     {
30         if (k==1)
31         {
32             for (i=0;i<4;i++)
33             {
34                 for (j=0;j<4;j++)
35                 {
36                     dp[1][i][j]=a[i][j];
37                 }
38             }
39         }
40         else
41         {
42             for (i=0;i<4;i++)
43             {
44                 for (j=0;j<4;j++)
45                 {
46                     dp[k][i][j]=0;
47                     for (l=0;l<4;l++)
48                     {
49                         dp[k][i][j]=(dp[k][i][j]+dp[k-1][i][l]*a[l][j]%MOD)%MOD;
50                     }
51                 }
52             }
53         }
54     }
55 }
56 int main()
57 {
58     int i,j,k,ca=1;
59     #ifndef ONLINE_JUDGE
60     freopen("1.in","r",stdin);
61     #endif
62     init();
63     while(scanf("%d",&n)!=EOF)
64     {
65         ll ans=0;
66         if(n==0)
67         {
68             printf("1\n");
69             continue;
70         }
71         int w[4]={0,1,2,3};
72         while(1)
73         {
74             ans=(ans+(dp[n][0][w[0]]*dp[n][1][w[1]]*dp[n][2][w[2]]*dp[n][3][w[3]])%MOD)%MOD;
75             if(!next_permutation(w,w+4)) break;
76         }
77         printf("%I64d\n",ans);
78     }
79 }

 

posted @ 2015-09-10 15:28  miao_a_miao  阅读(120)  评论(0编辑  收藏  举报