poj3254:基础状压dp

第二个状压dp

做过的第一个也是放牛问题,两头牛不能相邻

这个题多了一个限制,就是有些位置不能放牛

于是先与处理一下每一行所有不能放牛的状态,处理的过程直接对每一个不能放牛的状态或以下

ac代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define mod  100000000
int 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;
}
时间: 2024-10-25 04:31:23

poj3254:基础状压dp的相关文章

poj3254(状压dp)

题目连接:http://poj.org/problem?id=3254 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) 分析:dp[i][state]表示状态为state,到达i行时符合条件的总方案数,则dp[i][state]=sigma(dp[i-1][state'])state'为符合条件的状态. #include <cst

poj3254 Corn Fields (状压DP)

http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7588   Accepted: 4050 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parc

poj3254(Corn Fields)状压dp

题意:在n*m(1<=n,m<=12)的矩阵上种植玉米,任意共边的方格不能同时种,并且有些特定方格也不能种.问能有多少种种植的方案: 解法:很经典的状压模型.先将每一行的合法状态求出来,12的时候最多377个合法状态.然后进行与行之间的状态转移.最坏复杂度12*(377^2) 代码: /**************************************************** * author:xiefubao **********************************

POJ3254 状压DP入门

题目:http://poj.org/problem?id=3254 因为&运算写成&&--导致调试了快一个小时代的代码没有搞定 关于建图: 1.题目中是1表示可以放牧,0表示不可以放牧,但是建图的时候,可以放牧的位用0表示,不可以放牧的位用1表示.原因如下: 假设可以放牧的位用1表示,不可以放牧的位用0表示,那么假设当前行状态时1010   想要放置1001 ,&运算的结果是1,但是显然不合法, 也就是说  设值状态的意义,以及怎么判断是不是合法,这个在做之前一定考虑清楚再

POJ3254 状压dp

          Corn Fields Time Limit: 2000MS   Memory Limit: 65536K       Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a

poj3254 状压dp 每行独立 入门水题

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18789   Accepted: 9880 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yum

poj3254(状压dp)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19518   Accepted: 10243 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yu

poj1185:炮兵阵地(状压dp)

也算是比较基础的状压dp了,跟做过的第二道比较又稍微复杂了一点 需要记录之前两行的状态.. 统计结果也稍有不同 另外还学习了一个得到一个整数二进制位 1 的个数的位运算方法 详见代码: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespa

poj 3254 Corn Fields 状压dp入门

// poj3254 状压dp入门 // dp[i][S]表示前i行第i行状态为S时放牧的情况 // S为十进制的二进制数形式如5为101表示第一列和第三列放牧的方法数 // 首先dp[0][S]合法的话就是1 // 状态转移方程为dp[i][S] = sigma(dp[i-1][V])(S与V是合法状态) // 最后的结果就是dp[n][S](S为所有的合法状态) // // 刚开始十分傻x的dp[0][S]置为get(S),...get(S)是其中1的个数 // 这又不是求放羊的数量,这是方