sgu131 Hardwood floor
2014-10-15 22:01
337 查看
time limit per test: 0.25 sec. |
轮廓线DP。由于这两种放法会占用下一填充块的下方位置。所以边界需将当前填充块的下方考虑进去。 压缩状态时加一位,表示该位置。 代码: #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; long long dp[2][1500]; int main() { int m,n,cnt,i,j,k; scanf("%d%d",&m,&n); memset(dp,0,sizeof(dp)); cnt=0; dp[0][0]=1; for(i=0;i<m;i++) { for(j=0;j<n;j++) { memset(dp[cnt^1],0,sizeof(dp[cnt^1])); for(k=0;k<1<<(n+1);k++) { if(dp[cnt][k]==0) continue; if(k>>j&1) { if(k>>n&1) dp[cnt^1][k&~(1<<n)]+=dp[cnt][k]; else dp[cnt^1][k&~(1<<j)]+=dp[cnt][k]; } else { //1*2砖块 if(j<n-1&&!(k>>(j+1)&1)) { if(k>>n&1) dp[cnt^1][k&(~(1<<n))|(1<<(j+1))|1<<j]+=dp[cnt][k]; else dp[cnt^1][k|(1<<(j+1))]+=dp[cnt][k]; } if(i<m-1&&!(k>>n&1)) dp[cnt^1][k|(1<<j)]+=dp[cnt][k]; //3砖块 if(j<n-1&&i<m-1&&!(k>>(j+1)&1)&&!(k>>n&1)) dp[cnt^1][k|(1<<j)|(1<<(j+1))]+=dp[cnt][k]; if(j<n-1&&i<m-1&&!(k>>n&1)) dp[cnt^1][k|(1<<j)|(1<<n)]+=dp[cnt][k]; if(j>0&&i<m-1&&!(k>>(j-1)&1)&&!(k>>n&1)) dp[cnt^1][k|(1<<(j-1))|(1<<j)]+=dp[cnt][k]; if(j<n-1&&i<m-1&&!(k>>(j+1)&1)) { if(k>>n&1) dp[cnt^1][k|(1<<j)|1<<(j+1)]+=dp[cnt][k]; else dp[cnt^1][k|(1<<(j+1)|(1<<n))]+=dp[cnt][k]; } } } cnt^=1; } } printf("%lld\n",dp[cnt][0]); return 0; } |
相关文章推荐
- SGU - 131 Hardwood floor (状压DP)
- SGU 131 Hardwood floor(状压DP)
- SGU 131 Hardwood floor(状压DP)
- Hardwood floor - SGU 131(状态压缩)
- sgu 131 Hardwood floor
- SGU - 131 Hardwood floor (状态压缩)
- SGU 131 Hardwood floor
- sgu 131 - Hardwood floor
- SGU 131 Hardwood floor(状态压缩dp)
- SGU131 Hardwood floor
- [SGU 131]Hardwood floor(状压DP)
- 状态压缩dp/sgu 131 Hardwood floor
- SGU131 Hardwood floor
- SGU131 - Hardwood floor(状态压缩DP)
- SGU 131 Hardwood floor
- SGU-131--Hardwood floor--状态压缩DP
- SGU 131. Hardwood floor 状压dp 难度:2
- SGU 131.Hardwood floor 状态压缩DP
- [SGU]131. Hardwood floor
- SGC 131 Hardwood floor