首页 > 代码库 > poj3254:基础状压dp
poj3254:基础状压dp
第二个状压dp
做过的第一个也是放牛问题,两头牛不能相邻
这个题多了一个限制,就是有些位置不能放牛
于是先与处理一下每一行所有不能放牛的状态,处理的过程直接对每一个不能放牛的状态或以下
ac代码:
#include <iostream>#include <stdio.h>#include<string.h>#include<algorithm>#include<string>#include<ctype.h>using namespace std;#define mod 100000000int dp[15][4100];int cant[15];int n,m;void ini(){ memset(cant,0,sizeof(cant)); int x; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&x); if(x==0) { cant[i]|=(1<<j); } } }}void solve(){ memset(dp,0,sizeof(dp)); for(int i=0;i<1<<m;i++) { if(cant[0]&i) continue; if(i&(i<<1)) { dp[0][i]=0; } else { dp[0][i]=1; } } for(int i=1;i<n;i++) { for(int j=0;j<1<<m;j++) { if(j&cant[i]) continue; if(j&(j<<1)) continue; for(int k=0;k<1<<m;k++) { if(j&k) continue; dp[i][j]=(dp[i-1][k]+dp[i][j])%mod; } } } int ans=0; for(int i=0;i<1<<m;i++) { ans=(ans+dp[n-1][i])%mod; } printf("%d\n",ans);}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { ini(); solve(); } return 0;}
poj3254:基础状压dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。