纯暴力状态压缩dp,很水。几个for循环莫名其妙的少了一次,调了一个小时。。。。真是db
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define INF 1000000007
#define N 1000
LL dp[40][16][2][4];
LL ans[50];
int num[20];
int main(){
memset(num, 0, sizeof(num));
for(int i = 0; i <= 15; i++){
num[i] = num[i >> 1] + (i & 1);
}
memset(dp, 0, sizeof(dp));
for(int j = 0; j < 4; j++){
dp[1][(1 << j)][0][j] = 1;
}
for(int i = 2; i <= 31; i++){
for(int j = 0; j < 16; j++){
for(int k = 0; k <= 1; k++){
for(int z = 0; z < 4; z++){
if(!dp[i - 1][j][k][z])continue;
if(!(j & (1 << z)))continue;
for(int l = 0; l < 4; l++){
dp[i][j | (1 << l)][k | (abs(l - z) >= 3)][l] += dp[i - 1][j][k][z];
}
}
}
}
}
memset(ans, 0, sizeof(ans));
for(int i = 0; i <= 31; i++){
for(int j = 0; j < 16; j++){
if(num[j] < 3)continue;
for(int k = 0; k < 4; k++){
ans[i] += dp[i][j][1][k];
}
}
for(int i = 2; i < 32; i++){
printf("N=%d: %I64d\n", i, ans[i]);
}
return 0;
}