poj3254 Corn Fields
2016-02-05 20:30
330 查看
poj3254
分析
这道题算是状态压缩dp的入门题吧,知道状态压缩是个什么套路。题目
http://poj.org/problem?id=3254代码
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int mod=100000000; int n,m,top=0; int state[600],num[110]; int dp[20][600]; int cur[20]; bool ok(int x) { if(x&x<<1) return 0; return 1; } void init() { top=0; int total=1<<n; for(int i=0;i<total;i++) { if(ok(i)) state[++top]=i; } } bool fit(int x,int k) { if(x&cur[k]) return 0; return 1; } int main() { while(scanf("%d %d",&m,&n)!=EOF) { init(); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) { cur[i]=0; int num; for(int j=1;j<=n;j++) { scanf("%d",&num); if(num==0) cur[i]+=(1<<(n-j)); } } for(int i=1;i<=top;i++) { if(fit(state[i],1)) dp[1][i]=1; } for(int i=2;i<=m;i++) { for(int k=1;k<=top;k++) { if(!fit(state[k],i)) continue; for(int j=1;j<=top;j++) { if(!fit(state[j],i-1)) continue; if(state[k]&state[j]) continue; dp[i][k]=(dp[i][k]+dp[i-1][j])%mod; } } } int ans=0; for(int i=1;i<=top;i++) ans=(ans+dp[m][i])%mod; printf("%d\n",ans); } return 0; }
相关文章推荐
- ecshop 微信支付插件
- Mybatis 的日志管理
- 微信后台数据服务器
- ubuntu亮度调节失效
- codeforces AIM Tech Round
- HDU 4612 Warm up(边双连通分量)
- IIyarrAdetroSmorfsetacilpuDevomeR.80
- pcm2076最好的外置声卡芯片
- Threads and Anonymous Classes in JAVA
- LESS 学习记录(简单入门)
- 文件操作(File)
- Android开发之TextView高级应用
- Java [Leetcode 219]Contains Duplicate II
- 迭代器模式
- 系统架构设计师考试说明(2015)
- bbb rt2870
- C++自制Redis数据库(二)部分设计前置问题
- MySQL日志
- Slidingmenu与ViewPager广告栏滑动冲突解决分享
- HDU 2108 Shape of HDU(数学公式)