记录编号 | 159454 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | 走道铺砖问题 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 1.672 s | ||
提交时间 | 2015-04-21 16:06:35 | 内存使用 | 175.20 MiB | ||
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int mod=100000; class miku{ public: int n; int s[20]; miku(){n=1;memset(s,0,sizeof(s));} void operator = (int x) { memset(s,0,sizeof(s)); n=1; s[0]=x; } void operator += (const miku &b) { n=max(n,b.n)+1; for(int i=0;i<n;i++) { s[i]+=b.s[i]; s[i+1]+=s[i]/mod; s[i]%=mod; } while(n>1&&s[n-1]==0) n--; } void print(void){ printf("%d",s[n-1]); for(int i=n-2;i>=0;i--) printf("%05d",s[i]); } }; miku dp[41][13][1<<12]; int N,M; void DFS(int n,int p,int s1,int s2){ if(p>M) return; dp[n][p][s1]+=dp[n-1][p][s2]; DFS(n,p+1,s1<<1,(s2<<1)|1);//什么都不放 DFS(n,p+1,(s1<<1)|1,s2<<1);//竖着放 DFS(n,p+2,(s1<<2)|3,(s2<<2)|3); } int main(){ freopen("floor.in","r",stdin); freopen("floor.out","w",stdout); cin>>N>>M; if(M>N) swap(M,N); for(int i=1;i<=M;i++) dp[0][i][(1<<i)-1]=1; for(int i=1;i<=N;i++) DFS(i,0,0,0); dp[N][M][(1<<M)-1].print(); return 0; }