题目大意

给定一个N*M大小的大小的蛋糕,蛋糕的有些地方已经放置了东西,要求你在蛋糕上放入尽量少的1*2大小的巧克力,使得蛋糕不能够再放入巧克力

题解

和POJ1038恰好相反,此题是放入尽量少的巧克力,根据前两行的状态来进行当前行的放置,用dfs来进行三行的状态枚举,并同时检查放置是否合法,放完m列之后就可以进行状态转移了

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 130
#define INF 0x3f3f3f3f
int dp[2][MAXN][MAXN];
int n,m,s[75];
bool check(int step,int x,int y)
{
if(step>=1&&!(x&(1<<(step-1)))&&!(y&(1<<(step-1)))) return false;
if(step>=2&&!(x&(1<<(step-1)))&&!(x&(1<<(step-2)))) return false;
return true;
}
void dfs(int sum,int i,int x,int y,int st,int step)
{
if(!check(step,x,y)) return;
if(step==m)
{
dp[i][st][x]=min(dp[i][st][x],sum);
return;
}
if(!(x&(1<<step))&&!(st&(1<<step)))
dfs(sum+1,i,x|(1<<step),y,st|(1<<step),step+1);
if(step+2<=m&&!(x&(1<<step))&&!(x&(1<<(step+1))))
dfs(sum+1,i,x|(1<<step)|(1<<(step+1)),y,st,step+2);
dfs(sum,i,x,y,st,step+1);
}
int main()
{
scanf("%d%d",&n,&m);
char str[15];
memset(s,0,sizeof(s));
for(int i=1; i<=n; i++)
{
scanf("%s",str);
int len=strlen(str);
for(int j=0; j<len; j++)
s[i]|=(str[j]=='*'?1:0)<<j;
}
memset(dp,INF,sizeof(dp));
dp[1][s[1]][(1<<m)-1]=0;
for(int i=2; i<=n+1; i++)
{
memset(dp[i&1],INF,sizeof(dp[i&1]));
for(int j=0; j<(1<<m); j++)
for(int k=0; k<(1<<m); k++)
if(dp[(i+1)&1][j][k]!=INF)
dfs(dp[(i+1)&1][j][k],i&1,j,k,s[i],0);
}
int ans=INF;
for(int i=0; i<(1<<m); i++)
ans=min(ans,dp[(n+1)&1][0][i]);
printf("%d\n",ans);
return 0;
}

SGU132 - Another Chocolate Maniac(状态压缩DP)的更多相关文章

  1. SGU 132 Another Chocolate Maniac 状态压缩DP

    感觉不是很好写的一道状态压缩. dp[i][j][k]表示第 i 行状态为k,第i - 1行状态为 j,具体细节见代码. 内存卡的很死,要用滚动数组. 还有一个比较坑爹的地方是它在输入蛋糕的时候中间可 ...

  2. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

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

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

  4. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  5. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  6. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  7. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  8. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  9. Marriage Ceremonies(状态压缩dp)

     Marriage Ceremonies Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

随机推荐

  1. 数据聚合 & 分组:新一代系统监控的核心功能

    遥想 2015 年 8 月 17 日,Cloud Insight 还在梳理功能原型,畅想 Cloud Insight 存在的意义:为什么阿里云用户需要使用 Cloud Insight 来加强管理. 而 ...

  2. Java将整个文件夹里的文本中的字符串替换成另外一个字符串(可用于项目复制,变成另一个项目)

    import org.junit.Test; import java.io.*; /** * User: HYY * Date: 13-8-18 * Time: 下午8:11 * To change ...

  3. codeforces #313 div1 A

    捕获一只野生大水题! 首先我们知道边长为L的正三角形含有边长为1的小正三角形为L^2个 那么我们可以通过在六边形的正上,左下,右下补充正三角形使得原图形变成正三角形 然后再将补充的减去即可 #incl ...

  4. XmlDocument类

    XmlDocument类是.NET框架的DOC解析器.XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构.下面来看下XmlDocument提供了哪些功能. 一 ...

  5. IPC:Sockets

    Please refer to http://www.cs.cf.ac.uk/Dave/C/node28.html.

  6. JXL获取excel批注

    /** * Jxl.jar(2.6.12) * @author lmiky * @date 2011-11-26 */ public class JxlTest { /** * 测试获取批注 * @a ...

  7. poj2月下旬题解

    poj2388 水题 poj1273 最大流初步 poj2456 简单的二分答案 poj2309 论lowbit的重要性 poj1734 floyd求最小环 poj1001 细节题 poj2184 0 ...

  8. SCOI2009生日快乐

    竟然是搜索……囧 还以为是什么神题…… uses math; var x,y:extended; n:longint; function find(x,y:extended;z:longint):ex ...

  9. 自己定制Linux发行版(资料)

    /******************************************************************** * 自己定制Linux发行版(资料) * 声明: * 随着L ...

  10. RPi 2B apache2 mysql php5 and vsftp

    /************************************************************************* * RPi 2B apache2 mysql ph ...