比赛 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;
}