题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1438
思路:dp【i】【j】【k】【flag】:i代表第i个槽,j表示状态,k表示最后一个槽的深度,flag表示是否满足有两个相邻槽深度差为3
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
long long dp[40][30][30][30],sum[30];
int main()
{
for(long long i=0; i<16; i++)
{
long long lsb=i;
while(lsb)
{
sum[i]+=lsb&1;
lsb=lsb>>1;
}
}
dp[1][1][0][0]=dp[1][2][1][0]=dp[1][4][2][0]=dp[1][8][3][0]=1;
for(long long i=2; i<=31; i++)
{
for(long long j=1; j<16; j++)
{
for(long long k=0; k<4; k++)
{
for(long long v=0; v<4; v++)
{
long long sta=j|(1<<v);
dp[i][sta][v][1]+=dp[i-1][j][k][1];
if(abs(v-k)==3)
{
dp[i][sta][v][1]+=dp[i-1][j][k][0];
}
else
{
dp[i][sta][v][0]+=dp[i-1][j][k][0];
}
}
}
}
}
long long ans;
for(long long i=2; i<=31; i++)
{
ans=0;
for(long long j=1; j<16; j++)
{
if(sum[j]>=3)
for(long long k=0; k<4; k++)
{
ans+=dp[i][j][k][1];
}
}
printf("N=%lld: %lld\n",i,ans);
}
}