您的位置:首页 > 其它

【HDOJ】1438 钥匙计数之一

2015-01-16 14:27 141 查看
状态压缩。分最后一个槽的值以及当前的配置方案是否可以进行DP。

/* 1438 */
#include <cstdio>
#include <cstring>
#include <cstdlib>

#define MAXN 32

const int MAXS = 1<<4;

__int64 dp[MAXN][MAXS][4][2];
int cnt[1<<4];

int abs(int x) {
return x<0 ? -x:x;
}

int main() {
int i, j, k, n;
int s;
__int64 ans;

memset(cnt, 0, sizeof(cnt));
for (i=0; i<MAXS; ++i)
for (j=0; j<4; ++j)
if (i & (1<<j))
++cnt[i];

memset(dp, 0, sizeof(dp));
for (i=0; i<4; ++i)
dp[1][1<<i][i][0] = 1;

for (n=2; n<MAXN; ++n) {
for (i=0; i<MAXS; ++i) {
for (j=0; j<4; ++j) {
for (k=0; k<4; ++k) {
s = i | (1<<j);
dp
[s][j][1] += dp[n-1][i][k][1];
if (abs(j-k) == 3) {
dp
[s][j][1] += dp[n-1][i][k][0];
} else {
dp
[s][j][0] += dp[n-1][i][k][0];
}
}
}
}
}

for (n=2; n<MAXN; ++n) {
ans = 0;
for (i=0; i<MAXS; ++i) {
if (cnt[i] >= 3)
ans += dp
[i][0][1] + dp
[i][1][1] +\
dp
[i][2][1] + dp
[i][3][1];
}
printf("N=%d: %I64d\n", n, ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: