SGU132 - Another Chocolate Maniac(状态压缩DP)
题目大意
给定一个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)的更多相关文章
- SGU 132 Another Chocolate Maniac 状态压缩DP
感觉不是很好写的一道状态压缩. dp[i][j][k]表示第 i 行状态为k,第i - 1行状态为 j,具体细节见代码. 内存卡的很死,要用滚动数组. 还有一个比较坑爹的地方是它在输入蛋糕的时候中间可 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- Marriage Ceremonies(状态压缩dp)
Marriage Ceremonies Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
随机推荐
- uva 10730
题意:如果数列中没有三个元素的子序列构成等差数列输出yes 不然no 标记每个数出现的位置 然后从0开始寻找三个元素的等差数列 如果这三个元素的位置满足条件则原数列中存在等差数列 #include ...
- discuz云平台报调用远程接口失败的问题分析和解决
根据网络两篇文章整理 问题描述:当开通或关闭某个云平台服务的时候,报如下错误信息:调用远程接口失败.请检查您的服务器是否处于内网以及您服务器的防火墙设置. 云平台测试站点的接口文件正常,于是开始在文件 ...
- HTTP/1.1 Range和Content-Range
http://www.cnblogs.com/bayonetxxx/archive/2011/03/19/1989162.html 假设你要开发一个多线程下载工具,你会自然的想到把文件分割成多个部分, ...
- SGU128 Snake
SGU128,题意是给定N个点,问说能不能形成一个闭环G,要求G经过每个点,且在每个点处都有90度的转角,且不能出现自交. 没想出来,通过这提供的思路,由于每个点处都需要90度的转弯,因此每个点处必然 ...
- POJ3083——Children of the Candy Corn(DFS+BFS)
Children of the Candy Corn DescriptionThe cornfield maze is a popular Halloween treat. Visitors are ...
- 到底怎么样才叫看书?——Tony Zhao's
到底怎么样才叫看书?——上篇 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有点好笑:“这还用问,看书就是把书 ...
- android 引用 project以及下拉刷新开源类库Android-PullToRefresh 的使用
Android-PullToRefresh 是一个github上的开源下拉刷新类库, GitHub .此外,该作者还有另外一个实用度和关注量极高的项目–另一种Android ActionBar的实现 ...
- Red hat Linux(Centos 5/6)安装R语言
Red hat Linux(Centos 5/6)安装R语言1 wget http://cran.rstudio.com/src/base/R-3/R-3.0.2.tar.gz2 tar xzvf R ...
- 2013ACM省赛题目
地址就贴这一个吧 都在附近 当时回来也没做做 一伤心了 二是当时实在太弱了 先补两道DP E题的区间DP dp[i][j] 截止到i位置以字母j为结束的上升序列 正序 逆序各来一遍 再循环一遍保存一 ...
- MYI 文件内容
参考 http://blog.itpub.net/703656/viewspace-1018470/ 创建表结构 create table test(name char(20), age int, c ...