首页 > 代码库 > 【HDOJ】1438 钥匙计数之一
【HDOJ】1438 钥匙计数之一
状态压缩。分最后一个槽的值以及当前的配置方案是否可以进行DP。
1 /* 1438 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 6 #define MAXN 32 7 8 const int MAXS = 1<<4; 9 10 __int64 dp[MAXN][MAXS][4][2];11 int cnt[1<<4];12 13 int abs(int x) {14 return x<0 ? -x:x;15 }16 17 int main() {18 int i, j, k, n;19 int s;20 __int64 ans;21 22 memset(cnt, 0, sizeof(cnt));23 for (i=0; i<MAXS; ++i)24 for (j=0; j<4; ++j)25 if (i & (1<<j))26 ++cnt[i];27 28 memset(dp, 0, sizeof(dp));29 for (i=0; i<4; ++i)30 dp[1][1<<i][i][0] = 1;31 32 for (n=2; n<MAXN; ++n) {33 for (i=0; i<MAXS; ++i) {34 for (j=0; j<4; ++j) {35 for (k=0; k<4; ++k) {36 s = i | (1<<j);37 dp[n][s][j][1] += dp[n-1][i][k][1];38 if (abs(j-k) == 3) {39 dp[n][s][j][1] += dp[n-1][i][k][0];40 } else {41 dp[n][s][j][0] += dp[n-1][i][k][0];42 }43 }44 }45 }46 }47 48 for (n=2; n<MAXN; ++n) {49 ans = 0;50 for (i=0; i<MAXS; ++i) {51 if (cnt[i] >= 3)52 ans += dp[n][i][0][1] + dp[n][i][1][1] +53 dp[n][i][2][1] + dp[n][i][3][1];54 }55 printf("N=%d: %I64d\n", n, ans);56 }57 58 return 0;59 }
【HDOJ】1438 钥匙计数之一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。