POJ.3254 Corn Fields
来源:互联网 发布:大乐透算法必中5红 编辑:程序博客网 时间:2024/06/18 13:43
【题意】
给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法?
【解题方法】
定义状态dp【i】【j】,第 i 行状态为 j 的时候放牛的种数。j 的话我们转化成二进制,从低位到高位依次 1 表示放牛0表示没有放牛,就可以表示一行所有的情况。
那么转移方程 dp【i】【j】=sum(dp【i-1】【k】)
【AC code】//POJ.3254//Corn Fields#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N=13;const int M=1<<N;const int mod=1e8;int dp[N][M];//第i行状态为j时可以放牛的方案数int st[M],mp[M];//分别存给出的每一行的状态和给出的地的状态bool judge1(int x)//判断二进制是否有相邻的1{ return (x&(x<<1));}bool judge2(int i,int x)//判断上下行是否会出现相同位为1{ return mp[i]&st[x];}void init(){ memset(dp,0,sizeof(dp)); memset(st,0,sizeof(st)); memset(mp,0,sizeof(mp));}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { init(); int x,k=0; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%d",&x); if(x==0) mp[i]+=(1<<(j-1)); } } for(int i=0; i<(1<<m); i++) { if(!judge1(i)) st[k++]=i; } for(int i=0; i<k; i++) { if(!judge2(1,i)) dp[1][i]=1; } for(int i=2; i<=n; i++) { for(int j=0; j<k; j++) { if(judge2(i,j)) continue; for(int s=0; s<k; s++)//上一行的状态 { if(judge2(i-1,s)) continue; if(!(st[j]&st[s])) dp[i][j]+=dp[i-1][s]; } } } int ans=0; for(int i=0; i<k; i++) { ans+=dp[n][i]; ans%=mod; } printf("%d\n",ans); }}
0 0
- poj 3254Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254---Corn Fields
- poj 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- (poj)3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- POJ 3254 Corn Fields
- poj-3254-Corn Fields
- poj 3254 Corn Fields
- OLED屏幕和Rpi
- 有序数组的查找(个人感觉美到极致的一个算法)
- android js互相调用的方法,混淆后js无效,addJavascriptInterface使用注意事项
- TCP为什么要三次握手而结束要四次
- 51NOD 1108 距离之和最小 V2(中位数 + 化整为分)
- POJ.3254 Corn Fields
- 辗转相除法
- Android中按钮的点击事件的四种写法
- 在使用VC++6.0常见问题“Error spawning cl.exe”的解决方法
- C++ STL库的总结以及实现原理
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 错误的解决方法
- 字节对齐
- scott登录提示:the account is locked
- 让MFC程序具有XP风格的按钮及界面