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

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. Codeforces 834C - The Meaningless Game

    834C - The Meaningless Game 数学. 思路1:判断a•b能不能化成v3且a%v==0且b%v==0.v可以直接用pow求(或者用cbrt),也可以二分求:还可以用map映射预 ...

  2. C# ref和out的本质

    ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小.不同点就是输出参数必须对参数进行初始化.输出参数和引用参数的区别:从CLR的角度来看 ...

  3. PHP面向对象初中高级之由浅入深

    php面向对象编程基本实践:(了解类,类到对象的实例化,构造和析构,对象的引用); 类的概念: 物以类聚,把具有相似特性的对象对垒到一个类中 类定义了这些相似对象拥有的相同的属性和方法 类是相似对象的 ...

  4. nyoj737石子合并(一)

    先得出区间为1和2时的结果.用arr[i][j]记录i,j内的和.dp[i][j]记录i,j区间全加起来的最小花费.那么区间大小为1和2时都是明显的.为3时枚举断点.其中一个区间大小为1也是可行的. ...

  5. Android之ToolBar的使用

    Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android客户端的导航栏,以此来 ...

  6. mysql timestamp的默认值

    当default 0,default '0000-00-00 00:00:00'都失效的时候,请尝试下 ALTER table `coupon_gift` add column `time_end` ...

  7. php数组转化为字符串

    1.函数explode();  这个是字符串转化为数组 , implode() ;这个是数组转化为字符串. $array=explode(separator,$string); $string=imp ...

  8. JavaScript学习总结(六)——JavaScript判断数据类型总结

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断,在此做一个总结吧! 一.JS中的数据类型 1.数值型(Number):包括整数.浮 ...

  9. 铺音out2

    1◆ 忘记的 ed t   d     du dʒ dge   si ʒ su         ph f gh     ck k ch gh   2◆ 整理 success

  10. cas 服务端认证流程

    CAS服务端流程分析 'CAS单点登录服务器端的登录流程' -----流程的配置在/WEB-INF/login-webflow.xml文件中 <var name="credential ...