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 }