HDU

来源:互联网 发布:淘宝店铺logo分辨率 编辑:程序博客网 时间:2024/05/22 13:31

HDU - 1438:钥匙计数之一
一把锁匙有N个槽,槽深为1,2,3,4。每锁匙至少有3个不同的深度且至少有1对相连的槽其深度之差为3。求这样的锁匙的总数。
Input
本题无输入
Output
对N>=2且N<=31,输出满足要求的锁匙的总数。
Sample Output
N=2: 0N=3: 8N=4: 64N=5: 360..............N=31: ...
思路:d[n][i][j][k]---n表示第n个槽,i表示第n个槽深为i,j表示已经有几种槽(1,2,3,4)被用过(用二进制位上的0表示没用过,1表示用过),k表示是否有至少一对相连的槽深差为3(0表示没有,1表示有),d[n][i][j][k]表示满足这个状态的锁匙的数量。
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;long long d[32][5][1<<4][2];int main(){for(int n=2;n<=31;n++){memset(d,0,sizeof d);for(int i=1;i<=n;i++){if(i==1){d[i][1][1][0]=1;d[i][2][2][0]=1;d[i][3][4][0]=1;d[i][4][8][0]=1;}else{for(int j=0;j<(1<<4);j++){d[i][1][j|1][0]+=d[i-1][1][j][0]+d[i-1][2][j][0]+d[i-1][3][j][0];d[i][1][j|1][1]+=d[i-1][1][j][1]+d[i-1][2][j][1]+d[i-1][3][j][1]+d[i-1][4][j][1]+d[i-1][4][j][0];d[i][2][j|2][0]+=d[i-1][1][j][0]+d[i-1][2][j][0]+d[i-1][3][j][0]+d[i-1][4][j][0];d[i][2][j|2][1]+=d[i-1][1][j][1]+d[i-1][2][j][1]+d[i-1][3][j][1]+d[i-1][4][j][1];d[i][3][j|4][0]+=d[i-1][1][j][0]+d[i-1][2][j][0]+d[i-1][3][j][0]+d[i-1][4][j][0];d[i][3][j|4][1]+=d[i-1][1][j][1]+d[i-1][2][j][1]+d[i-1][3][j][1]+d[i-1][4][j][1];d[i][4][j|8][0]+=d[i-1][2][j][0]+d[i-1][3][j][0]+d[i-1][4][j][0];d[i][4][j|8][1]+=d[i-1][1][j][1]+d[i-1][2][j][1]+d[i-1][3][j][1]+d[i-1][4][j][1]+d[i-1][1][j][0];}}}long long ans=0;for(int i=1;i<=4;i++)ans+=d[n][i][15][1]+d[n][i][14][1]+d[n][i][13][1]+d[n][i][11][1]+d[n][i][7][1];printf("N=%d: %lld\n",n,ans);}return 0;}


原创粉丝点击