POJ 3254 Corn Fields状态压缩DP
下面有别人的题解报告,并且不止这一个状态压缩题的哦····
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的更多相关文章
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- [ACM] POJ 3254 Corn Fields(状态压缩)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8062 Accepted: 4295 Descr ...
- poj 3254 Corn Fields 国家压缩dp
意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...
- POJ 3254 Corn Fields 状态压缩
这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...
- poj 3254 Corn Fields_状态压缩dp
感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...
随机推荐
- Spring AMQP 源码分析 01 - Impatient
### 准备 ## 目标 了解 Spring AMQP 核心代码 ## 前置知识 RabbitMQ 入门 ## 相关资源 Quick Tour for the impatient:&l ...
- mac外接显示器 双屏同时滑动问题
问题:mac pro 外接一个显示器,用四个手指横向切换屏幕的时候,外接的显示器也一起跟着动了 解决:
- 百度定位SDK
按照官网要求配置SHA1和包名生成ak秘钥 生成秘钥命令: keytool -list -v -keystore debug.keystore 密码:原始密码为android 添加libs文件夹并在g ...
- 20 多继承 MRO 算法 深度优先遍历 super
类的多继承 一个类可以继承多个无关的类. 一个类可以被多个无关的类继承 1.经典类. 在python2.2之前. 已经是历史了. MRO 采用的是树形结构的深度递归遍历(一条道跑到黑) 2.新式类 在 ...
- 通过AO连接多个EO并进行使用
参考资料 在toolbox下的Tutorial工程里面 \oracle\apps\fnd\framework\toolbox\tutorial\server\PurchaseOrdersSVO
- quartz---springmvc的配置文件正合
quartz---springmvc的配置文件正合 XML <beans xmlns="http://www.springframework.org/schema/beans" ...
- HTML5绘制几何图形
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- Animation鱼眼效果
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- OC MRC之 @property参数(代码分析)
第一部分 // // main.m // 04-@property参数 // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. ...
- 进程控制fork vfork,父子进程,vfork保证子进程先运行
主要函数: fork 用于创建一个新进程 exit 用于终止进程 exec 用于执行一个程序 wait 将父进程挂起,等待子进程结束 getpid 获取当前进程的进程ID nice 改变进程的优先级 ...