【状压DP】BZOJ 1725 Usaco Corn Fields牧场的安排

题目和SCOI互不侵犯 很相似,感觉棋盘形的状压DP主要在于预处理状态。转移以及判断倒不是很难。

#include <cstdio>
#include <algorithm>

const int State = (1<<12)+5;
const int MOD = 100000000;

int n,m,Count;
int dp[20][State],Map[20];
int num[State],now[State];
bool Can[State][State];
long long ans;

//预处理
void Run(){
    for(int i=0;i<(1<<m);i++){
        if(i & (i>>1) ) continue;
        now[++Count] = i;
        for(int j=i;j;j>>=1) num[Count]+=(j&1);//当前状态会有几个地方有草
    }
    for(int i=0;i<=Count;i++)
        for(int j=0;j<=Count;j++)
            if( !(now[i]&now[j]) ) Can[i][j]=1;//这两种方案是否冲突
}

int main(){
    scanf("%d%d",&n,&m);
    Run();
    for(int i=1;i<=n;i++){
        int x ;
        for(int j=0;j<m;j++){
            scanf("%d",&x);
            Map[i]|=(x<<j);
            //将本行的状态压缩
        }
    }
    for(int i=1;i<=Count;i++) if( now[i] == (now[i]&Map[1]) ) dp[1][i]=1;
    for(int i=2;i<=n;i++){
        for(int j=1;j<=Count;j++){
            if( (now[j]&Map[i]) != now[j] ) continue;
            for(int k=1;k<=Count;k++){
                if( Can[j][k] ) dp[i][j] = (dp[i][j]+dp[i-1][k])%MOD;
            }
        }
    }
    for(int i=1;i<=Count;i++) ans=(ans+dp[n][i])%MOD;
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-10-13 09:30:10

【状压DP】BZOJ 1725 Usaco Corn Fields牧场的安排的相关文章

bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 714  Solved: 502[Submit][Status][Discuss] Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是

【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地

BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290[Submit][Status] Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫

【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排

[算法]状压DP [题解]对于上一行的每个状态,每行进行DFS. #include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const int maxn=20,maxN=10000,MOD=100000000; ll f[2][maxN]; int n,m,x,h; bool map[maxn][maxn]; void dfs(int

【bzoj1725/Usaco2006 Nov】Corn Fields牧场的安排——状压dp

Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少

[Usaco2006 Nov]Corn Fields牧场的安排

题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供

BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排

Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少

bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状态压缩DP)

本来就是一个写不大来动态规划的人,结果现在又了解到还有种东西叫状态压缩dp,唉... 找了一道例题来试试看:http://www.lydsy.com/JudgeOnline/problem.php?id=1725 解:我们用f[i][j]来表示当前第i行,状态为j的情况下,(且之前的1~i-1的方案数已经确定了),前i行有多少种方案,那么动态转移方程其实很明显: f[i][j]=sum(f[i-1][k]);(当上一行为第k种状态且与当前枚举的第i种状态不会产生相邻的土地,就加上f[i-1][k

【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排

题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供