您的位置:首页 > 其它

POJ 3254 Corn Fields状态压缩DP

2013-07-31 21:29 495 查看
下面有别人的题解报告,并且不止这一个状态压缩题的哦····

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

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

#include <cstdio>
#include <cstring>
int dp[2][400];
int st[400];
//检查一行的奶牛放置情形是否合理
//即是否有相邻的两个1,没有返回true
bool checkHori(int state)
{
if(!(state & (state << 1)) ) 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=0;
for( int i=0; i<(1<<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,0,sizeof(dp));
dp[0][0] = 1;
int x=0;
for(int i=1; i<=m; ++i)
{
int t,tmp=1,map =0; //map用来记录第i行土地的土壤状态
for(int d=0; d<n ; ++d)
{
scanf("%d",&t);
map += t*tmp;
tmp *=2;
}
x =1-x;
for(int j=0; j< num; ++j)
dp[x][j] = 0;  //滚动数组,用时间换空间
for(int j=0; j< num; ++j)
{
for(int k=0; k < num; ++k)
{
if(checkPos(map,st[k]) && (i == 1 || checkVert(st[k],st[j]) )  )
dp[x][k] += dp[1-x][j];
}
}
}
int ans=0;
for(int i=0; i< num; ++i)
{
ans += (dp[x][i] % 100000000);
ans %= 100000000;
}
printf("%d\n",ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: