这题对我真的非常难。实在做不出来,就去百度了,搜到了一种状压DP的方法。这是第一种

详细见凝视

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define mod 100000000
int n,m,map[15];//map数组用来存图
int cnt[10000],dp[15][10000];//cnt存当一层每处都能够放置东西时,全部满足题意的情况
int k;
bool ok(int x)//推断某种方法是否满足题意
{
if(x&(x<<1)) return false; //假设某点左右有点的话,返回false
return true;
}
void find()
{
for(int i=0;i<(1<<m);i++) //从0開始到1<<m。找到全部单层满足题意的情况
{
if(ok(i)) cnt[k++]=i;
}
}
int main()
{
int i,j,temp;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>temp;
if(!temp) map[i]|=1<<j;//此处存图应该注意。与题中相反的是,当某点不能够放置东西时,应该置为1。便于兴许操作
}
}
k=0;
memset(dp,0,sizeof(dp));
memset(cnt,0,sizeof(cnt));
find();
for(i=0;i<k;i++)//初始化第一行
{
if(!(map[0]&cnt[i]))
{
dp[0][i]=1;
}
}
for(i=1;i<n;i++)//从第二行開始进行递推
{
for(j=0;j<k;j++)
{
if(map[i-1]&cnt[j]) continue;
for(int p=0;p<k;p++)
{
if((map[i]&cnt[p])||(cnt[p]&cnt[j])) continue;
dp[i][p]=(dp[i][p]+dp[i-1][j])%mod;
}
}
}
int ans=0;
for(i=0;i<k;i++)//算出全部的情况
{
ans=(ans+dp[n-1][i])%mod;
}
cout<<ans<<endl;
}
return 0;
}

另外一种方法是状态压缩+记忆化搜索。这是我从瓜神那看来的记忆化搜索,然后依据我从上个代码中学来的东西改进了下,QAQ。要学的东西还有非常多。慢慢来吧

主要思路是从第一层開始向下搜索,假设搜到符合条件的就继续向下搜索,直到最后一行为止

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 20
#define mod 100000000
int map[maxn];
int dp[maxn][1<<12];
int n,m;
bool ok(int i,int state,int cur)
{
if(map[cur]&i) return false;//推断是否会把东西放在不能放东西的地方
if(i&(i<<1)) return false;//推断东西的左右是否放置了东西
if(cur)
{
if(state&i) return false;//推断东西的上边是否放置了东西
}
return true;
}
int dfs(int cur,int state)
{
if(cur==n) return dp[cur][state]=1;
if(dp[cur][state]!=-1) return dp[cur][state];//记忆化搜索
int ret=0;
for(int i=0;i<(1<<m);i++)
{
if(ok(i,state,cur))//推断下一条边能否够增加
{
ret+=dfs(cur+1,i);
ret%=mod;
}
}
return dp[cur][state]=ret%mod;
}
int main()
{
int t;
cin>>n>>m;
memset(map,0,sizeof(map));
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>t;
if(!t) map[i]|=1<<j;
}
}
cout<<dfs(0,0)<<endl;
return 0;
}

POJ 3254 Corn Fields 状态压缩的更多相关文章

  1. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  2. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  3. [ACM] POJ 3254 Corn Fields(状态压缩)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8062   Accepted: 4295 Descr ...

  4. POJ 3254 Corn Fields 状态压缩DP (C++/Java)

    id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...

  5. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  6. POJ 3254 Corn Fields状态压缩DP

    下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...

  7. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  8. poj 3254 Corn Fields 国家压缩dp

    意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...

  9. poj 3465 Corn Fields 状态压缩

    题目链接:http://poj.org/problem?id=3254 #include <cstdio> #include <cstring> #include <io ...

随机推荐

  1. Solr linux安装

    1.下载安装(自行官网下载) 2.解压安装包 3.进入解压后的bin目录执行命令: ./solr start 出现如下警告: 根据提示修改solr.in.sh中的SOLR_ULIMIT_CHECKS属 ...

  2. 关于在smarty中实现省市区三级联动

    刚开始接触php,,其实对于一些比较深入的东西还不是很了解,就像是这次的省市区联动,都是用三张表为基础编码的,原谅我的无知,谢谢. 接下来就是编码部分了: <?php require('./sm ...

  3. POJ 3254:Corn Fields(状态压缩DP)

    题目大意:一个矩形的草地,分为多个格子,有的格子可以有奶牛(标为1),有的格子不可以放置奶牛(标为0),计算摆放奶牛的方案数. 分析: f[i,j]表示第i行状态为j的方案总数. 状态转移方程f[i, ...

  4. C#,一种简单的方式实现滚动鼠标缩放图片,平移

    1.缩放 private void ImageShow_Load(object sender, EventArgs e) { pictureBox1.Load(@"E:\SQ1.jpg&qu ...

  5. P1463 [HAOI2007]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  6. [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]

    题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...

  7. 地理课(geography)

    地理课(geography) 题目描述 地理课上,老师给出了一个巨大的地图,由于世界日新月异,会有一些道路在某一时刻被删除,也会有一些道路在某一时刻被修建.这里的道路均为双向的. 老师认为,有一些城市 ...

  8. 三叉神经树 ( neuron )

    三叉神经树 ( neuron ) 题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物SHTSC 的密切联系引起了人们的极大关注. S ...

  9. Codeforces Round #363 (Div. 2) B 暴力

    Description You are given a description of a depot. It is a rectangular checkered field of n × m siz ...

  10. Do not use built-in or reserved HTML elements as component id: header

    刚刚在搭建项目时发现控制台报错 查找发现是因为组件名称所致,也就是当我们起名一个header.vue的组件时,我们安装的vue插件会自动把name设置为default 这就造成了错误 把header修 ...