下面有别人的题解报告,并且不止这一个状态压缩题的哦····

http://blog.csdn.net/accry/article/details/6607703

下面是我的代码,代码很挫,绝对有很大的优化的空间····

 #include <cstdio>
#include <cstring>
int dp[][( << ) + ];
//检查一行的奶牛放置情形是否合理
//即是否有相邻的两个1,没有返回true
bool checkHori(int state)
{
if(!(state & (state << )) ) return true;
else return false;
} //检查竖直方向的奶牛放置情形是否合理
//即是否竖直方向有相同的1
bool checkVert(int a,int b)
{
if(!(a&b)) return true;
else return false;
} //看该位置是否是肥沃的土地
//关系式自己推出来
bool checkPos(int map,int state)
{
if( (map| state) == map) return true;
else return false ;
} //该算法时间复杂度很高,为O(m*2^(2*n))
//最坏情况下为O(12*2^24),10^8左右,一定是可以改进的
int main()
{
freopen("in.cpp","r",stdin);
int m,n;
scanf("%d%d",&m,&n);
memset(dp,,sizeof(dp));
dp[][] = ;
int x=;
for(int i=; i<=m; ++i)
{
int t,tmp=,map =; //map用来记录第i行土地的土壤状态
for(int d=; d<n ; ++d)
{
scanf("%d",&t);
map += t*tmp;
tmp *=;
}
x =-x;
for(int j=; j< ( << n); ++j)
dp[x][j] = ; //滚动数组,用时间换空间
for(int j=; j< ( << n); ++j)
{
for(int k=; k < ( << n); ++k)
{
if( checkHori(k) && checkPos(map,k) && (i == || checkVert(k,j) ) )
dp[x][k] += dp[-x][j];
}
}
}
int ans=;
for(int i=; i< ( << n); ++i)
{
ans += (dp[x][i] % );
ans %= ;
}
printf("%d\n",ans);
return ;
}

通过计算得出,当n = 12时,2^12 = 4096,而一行能成功放置的方法数仅为377,

由此可先预处理,离散化存储,极大地降低复杂度。新的算法的复杂度最坏情况下为12*377*377,大概为10^6的复杂度。

 #include <cstdio>
#include <cstring>
int dp[][];
int st[];
//检查一行的奶牛放置情形是否合理
//即是否有相邻的两个1,没有返回true
bool checkHori(int state)
{
if(!(state & (state << )) ) return true;
else return false;
} //检查竖直方向的奶牛放置情形是否合理
//即是否竖直方向有相同的1
bool checkVert(int a,int b)
{
if(!(a&b)) return true;
else return false;
} //看该位置是否是肥沃的土地
//关系式自己推出来
bool checkPos(int map,int state)
{
if( (map| state) == map) return true;
else return false ;
} int init(int n)
{
int num=;
for( int i=; i<(<<n); ++i )
{
if(checkHori(i))
{
st[num++] = i;
}
}
return num;
}
int main()
{
// freopen("in.cpp","r",stdin);
int m,n;
scanf("%d%d",&m,&n);
int num=init(n);
memset(dp,,sizeof(dp));
dp[][] = ;
int x=;
for(int i=; i<=m; ++i)
{
int t,tmp=,map =; //map用来记录第i行土地的土壤状态
for(int d=; d<n ; ++d)
{
scanf("%d",&t);
map += t*tmp;
tmp *=;
}
x =-x;
for(int j=; j< num; ++j)
dp[x][j] = ; //滚动数组,用时间换空间
for(int j=; j< num; ++j)
{
for(int k=; k < num; ++k)
{
if(checkPos(map,st[k]) && (i == || checkVert(st[k],st[j]) ) )
dp[x][k] += dp[-x][j];
}
}
}
int ans=;
for(int i=; i< num; ++i)
{
ans += (dp[x][i] % );
ans %= ;
}
printf("%d\n",ans);
return ;
}

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

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

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

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

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

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

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 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入门)

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

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

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

  7. poj 3254 Corn Fields 国家压缩dp

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

  8. POJ 3254 Corn Fields 状态压缩

    这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...

  9. poj 3254 Corn Fields_状态压缩dp

    感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...

随机推荐

  1. NGUI 中,长技能图标显示技能Tips的核心代码

    需要将技能图标对应的位置Pos赋给Tips即可.下面是计算 Pos 的核心代码: using UnityEngine; public class LgsTest : MonoBehaviour { [ ...

  2. Java读写记事本文件

    Java中我们也会考虑读写记事本,文件读取如下: public static void main(String[] args) { try { String path="d:\\abc.tx ...

  3. vs.net应用程序图标以及制作安装程序快捷方式图标设置

           我们通常在开发软件完毕后需要打包制作安装程序,这个时侯一般都会需要设置应用程序的图标,使用默认的图标一般都比较难看,那么我们应该怎样设置自定义的图标呢? 我现在要讲的图标设置有两种情况, ...

  4. IntelliJ IDEA 进行多线程调试

      idea的断点有不同的模式,只有当Thread模式下才能调试多线程   断点设置步骤: 1.在断点上右键 2.选择Thread,然后点Done(建议选择Thread后点击make default把 ...

  5. pandas的concat函数和append方法

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, nam ...

  6. 浅谈Linux

    Linux系统最初由芬兰赫尔辛基大学的Andrew S.Tanenbaum写的MINIX操作系统演变而来,这是一个小型操作系统,主要用于教学,1991年1月,Tanenbaum的学生Linus Tor ...

  7. OAF 交互式列车 上一步 下一步的简单使用

    在实际的需求中,我们往往会遇到在下一步的时候验证某些参数,而上一步不需要验证. 这个是非常粗暴的解决方式 if( "goto".equals(pageContext.getPara ...

  8. CentOS搭建“加速器”

    1.安装Shadowsocks 服务端 yum -y update yum install -y python-setuptools && easy_install pip pip i ...

  9. PHP:第四章——数组中的排序函数

    <pre> <?php header("Content-Type:text/html;charset=utf-8"); //1) /*sort - 对数组进行升序 ...

  10. cas AuthenticationFilter

    AuthenticationFilter *** 这个类的作用:判断是否已经登录,如果没有登录则根据配置的信息来决定将跳转到什么地方 *** casServerLoginUrl:定义cas 服务器的登 ...