//好久没水题了,水一发记忆化好了= ̄ω ̄=
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 #include "cmath" 6 using namespace std; 7 __int64 dp[20][5][2][2]; 8 bool vis[20][5][2][2]; 9 int n; 10 11 __int64 dfs(int rem, int num, int _14, int _23) 12 { 13 if(rem == 0) { 14 if(_14 && _23) 15 return 1; 16 return 0; 17 } 18 if(vis[rem][num][_14][_23]) 19 return dp[rem][num][_14][_23]; 20 vis[rem][num][_14][_23] = 1; 21 int i, n_14, n_23; 22 for(i = 1; i <= 4; ++i) { 23 if(_14 == 1 || (fabs(int(i - num))==3 && num != 0)) 24 n_14 = 1; 25 else 26 n_14 = 0; 27 if(_23 == 1 || i == 2 || i == 3) 28 n_23 = 1; 29 else 30 n_23 = 0; 31 dp[rem][num][_14][_23] += dfs(rem - 1, i, n_14, n_23); 32 } 33 return dp[rem][num][_14][_23]; 34 } 35 36 int main() 37 { 38 while(scanf("%d", &n) && (n != -1)) { 39 printf("%d: %I64d\n", n, dfs(n, 0, 0, 0)); 40 } 41 }
时间: 2024-11-03 02:15:31