本文主要是介绍(Luogu) P1879 [USACO06NOV]玉米田Corn Fields (状压dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
传送门
位运算要掌握好
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int mod=1e9;
const int N=15;
//il int Add(int &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(int &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
int n,m,mp[N][N],state[1<<13],ma[1<<13];
ll dp[N][1<<13];
int main(){std::ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cin>>mp[i][j]; ma[i]=(ma[i]<<1)+mp[i][j]; //记录这一层土地状态 } }int mx=1<<m;for(int i=0;i<mx;++i){state[i]=((i>>1)&i)==0 && ((i<<1)&i)==0;//满足没有相邻的1 }dp[0][0]=1;//初始第0层全是0的状态 for(int i=1;i<=n;++i){for(int j=0;j<mx;++j){//枚举这一层可能的状态 if(state[j] && (j&ma[i])==j){//状态合理 for(int k=0;k<mx;++k){//枚举上一层的状态 if((k&j)==0){dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;}} } }}int ans=0;for(int i=0;i<mx;++i){ans=(ans+dp[n][i])%mod;} cout<<ans<<endl;return 0;
}
这篇关于(Luogu) P1879 [USACO06NOV]玉米田Corn Fields (状压dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!