记录编号 160312 评测结果 AAAAAAAAAA
题目名称 走道铺砖问题 最终得分 100
用户昵称 Gravatarwolf. 是否通过 通过
代码语言 C++ 运行时间 0.766 s
提交时间 2015-04-24 23:16:57 内存使用 27.73 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#include<bitset>
#include<vector>
#include<deque>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<cstdio>
using namespace std;
#if defined wolf
const string ok="OK";
const string kk="	";
ofstream nnew("floor.in",ios::app);
ifstream fin("floor.in");
#define fout cout
#define Endl endl
#else
ifstream fin("floor.in");
ofstream fout("floor.out");
#endif
class HDint{
public:
	vector<int> num;
	HDint(){
	}
	HDint(int a){
		while(a/10000>0){
			num.push_back(a%10000);
			a=a/10000;
		}
	}
	void operator = (int b){
		num.push_back(b);
	}
	void pprint(){
		fout<<num.back();
		for(int i=num.size()-2;i>=0;--i){
			fout<<setfill('0')<<setw(4)<<num[i];
		}
	}
};
HDint operator + (const HDint A,const HDint B){
	/*cout<<A.num.back();
	for(int i=A.num.size()-2;i>=0;--i){
		fout<<setfill('0')<<A.num[i];
	}
	cout<<endl;
	cout<<B.num.back();
	for(int i=B.num.size()-2;i>=0;--i){
		fout<<setfill('0')<<A.num[i];
	}
	cout<<endl;
	*/
	HDint ans;
	int mmin=min(A.num.size(),B.num.size());
	for(int i=0;i!=mmin;++i){
		ans.num.push_back(A.num[i]+B.num[i]);
	}
	if(A.num.size()>B.num.size()){
		for(int i=mmin;i<A.num.size();++i){
			ans.num.push_back(A.num[i]);
		}
	}else{
		for(int i=mmin;i<B.num.size();++i){
			ans.num.push_back(B.num[i]);
		}
	}
	int r=0;
	for(int i=0;i!=ans.num.size();++i){
		ans.num[i]+=r;
		r=ans.num[i]/10000;
		ans.num[i]=ans.num[i]%10000;
		if(r>0&&i==ans.num.size()-1){
			ans.num.push_back(0);
		}
	}
	return ans;
}
int n,m;
HDint FF[45][13][1<<12];
void DP(int n,int p ,int now,int nex){
	if(p>m){//查找的位置已经大于宽度
		return;
	}
	FF[n][p][now]=FF[n-1][p][nex]+FF[n][p][now];
	DP(n,p+1,now*2,nex*2+1);//不放的时候的状态
	DP(n,p+1,now*2+1,nex*2);//竖着放置的状态
	DP(n,p+2,now*4+3,nex*4+3);//横着放置的状态
}
int main(){
	fin>>n>>m;
	if(m>n){
		swap(m,n);
	}
	for(int i=1;i<=m;++i){///////
		FF[0][i][(1<<i)-1]=1;
	}
	for(int i=1;i<=n;++i){///////
		DP(i,0,0,0);
	}
	FF[n][m][(1<<m)-1].pprint();
	//fout<<FF[n][m][(1<<m)-1]<<endl;
	//-------------------------*/
	#if defined wolf
	cout<<endl<<(double)clock()/CLOCKS_PER_SEC<<'s'<<endl;
	#endif
	return 0;
}
//Designed by wolf
//Fri Apr 24 2015