比赛 |
20120614 |
评测结果 |
AAAAAAEEEA |
题目名称 |
小D的背包问题 |
最终得分 |
70 |
用户昵称 |
ZhouHang |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-06-14 18:10:35 |
显示代码纯文本
/**
*Prob : baga
*Data : 2012-6-14
*Sol : [骗分]状态压缩递推
*Author : Zhou Hang
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MaxT 16
#define oo 997
#define MaxN 1000000
using namespace std;
int n,i,j;
int f[MaxN][MaxT];
//k表示在第k个格子,s表示当前铺砖状态,news表示下一层被上一层所影响的状态
void Dfs(int k,int s,int news)
{
if (k==4)
{
f[i+1][news]=(f[i+1][news]+f[i][j])%oo;
return;
}
//当前位置已经被铺就跳下一格
if ( s&(1<<k) )
Dfs(k+1,s,news);
else {
//竖铺
Dfs(k+1,s|(1<<k),news|(1<<k));
//横铺
if ( ((s&(1<<(k+1)))==0 ) && (k+1<4) )
Dfs(k+2,((s|(1<<k)))|((1<<(k+1)) ),news);
}
}
int main()
{
freopen("baga.in","r",stdin);
freopen("baga.out","w",stdout);
scanf("%d",&n);
f[1][0]=1;
for (i=1; i<=n; i++)
{
for (j=0; j<=15; j++)
if (f[i][j]>0) Dfs(0,j,0);
}
printf("%d\n",f[n+1][0]%oo);
fclose(stdin); fclose(stdout);
return 0;
}