SGU 132 Another Chocolate Maniac 状态压缩DP
感觉不是很好写的一道状态压缩。
dp[i][j][k]表示第 i 行状态为k,第i - 1行状态为 j,具体细节见代码。
内存卡的很死,要用滚动数组。
还有一个比较坑爹的地方是它在输入蛋糕的时候中间可能会出现空行,一开始我用getchar()读,连第一组数据都过不去,后来改成scanf( "%s", str )才过……错了好多次。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ;
const int INF = << ; int M, N, all;
int G[];
int dp[][MAXN][MAXN];
int TwoPow[MAXN];
int initJ, initK;
int cur, pre;
char str[]; void init()
{
memset( G, , sizeof(G) );
for ( int i = ; i <= M; ++i )
{
scanf( "%s", str );
for ( int j = ; j < N; ++j )
{
if ( str[j] == '*' )
G[i] |= ( << j );
}
//printf( "G[%d]=%d\n", i, G[i] );
} TwoPow[] = ;
for ( int i = ; i <= N; ++i )
TwoPow[i] = ( TwoPow[i - ] << ); all = ( << N ) - ;
return;
} //c:当前列, j:当前行的上两行状态, k:当前行的上一行状态
//State:当前行状态, cnt:当前摆放巧克力个数
void DFS( int c, int j, int k, int State, int cnt )
{
//当前行的上两行中出现了2*1的空格
if ( c > && ( ( j & TwoPow[c-] ) == ) && ( ( k & TwoPow[c-] )== ) )
return; //当前行的上一行中出现了1*2的空格
if ( c > && ( ( k & TwoPow[c-] ) == ) && ( ( k & TwoPow[c-] )== ) )
return; if ( c == N ) //当前行摆放完成,状态转移
{
dp[cur][k][State] = min( dp[cur][k][State], dp[pre][initJ][initK] + cnt );
//printf("dp[%d][%d][%d] = %d\n", cur, k, State, dp[cur][k][State] );
return;
} DFS( c + , j, k, State, cnt ); //当前行的上一行放2*1的巧克力并影响当前行的状态
if ( ( ( k & TwoPow[c] ) == ) && ( ( State & TwoPow[c] ) == ) )
DFS( c + , j, k | TwoPow[c], State | TwoPow[c], cnt + ); //当前行的上一行放1*2的巧克力
if ( c + < N && ( ( k & TwoPow[c] ) == ) && ( ( k & TwoPow[c + ] ) == ) )
DFS( c + , j, k | TwoPow[c] | TwoPow[c + ] , State, cnt + ); return;
} void DP()
{
pre = ;
cur = ; for ( int j = ; j <= all; ++j )
for ( int k = ; k <= all; ++k )
dp[][j][k] = INF;
dp[][ all ][ G[] ] = ;
//printf("**dp[0][%d][%d] = %d\n", all, G[1], dp[0][all][G[1]] ); for ( int i = ; i <= M; ++i )
{
for ( int j = ; j <= all; ++j )
for ( int k = ; k <= all; ++k )
dp[cur][j][k] = INF; for ( int j = ; j <= all; ++j )
for ( int k = ; k <= all; ++k )
{
if ( dp[pre][j][k] != INF )
{
initJ = j, initK = k;
DFS( , j, k, G[i + ], );
}
} pre ^= ;
cur ^= ;
}
return;
} int main()
{
while ( scanf( "%d%d", &M, &N ) == )
{
init();
DP(); int ans = INF;
for ( int i = ; i <= all; ++i )
ans = min( ans, dp[pre][i][] );
printf( "%d\n", ans );
}
return ;
}
SGU 132 Another Chocolate Maniac 状态压缩DP的更多相关文章
- SGU 132. Another Chocolate Maniac 状压dp 难度:1
132. Another Chocolate Maniac time limit per test: 0.25 sec. memory limit per test: 4096 KB Bob real ...
- SGU132 - Another Chocolate Maniac(状态压缩DP)
题目大意 给定一个N*M大小的大小的蛋糕,蛋糕的有些地方已经放置了东西,要求你在蛋糕上放入尽量少的1*2大小的巧克力,使得蛋糕不能够再放入巧克力 题解 和POJ1038恰好相反,此题是放入尽量少的巧克 ...
- SGU 132.Another Chocolate Maniac
时间限制:0.25s 空间限制:4M 题目: Bob非常喜欢巧克力,吃再多也觉得不够.当他的父母告诉他将要买很多矩形巧克力片为他庆祝生日时,他的喜悦是能被理解的.巧克力都是 2x1 或 1x2 的矩形 ...
- 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 ...
随机推荐
- shell 进程查询相关的命令
同一个进程部署多个,如何知道删除哪个: ll /proc/ 会显示位置 查看pid下哪些socket链接 ll /proc//fd
- UML 用例图,时序图,活动图的定义以及区别
1.用例图,时序图,活动图的定义 1.用例图: 用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" ...
- 版本控制 - SVN/TortoiseSVN
研读了blog: 1. http://www.open-open.com/lib/view/open1346982569725.html 2. http://www.360doc.com/conte ...
- Leetcode#127 Word Ladder
原题地址 BFS Word Ladder II的简化版(参见这篇文章) 由于只需要计算步数,所以简单许多. 代码: int ladderLength(string start, string end, ...
- HDU 4148 Length of S(n)(字符串)
题目 字符串处理 题意要猜,解析见代码: /* 这题每个S(n)是描述S(n-1)值 例如: S(1)=1; S(2)=11;即描述S(1)有1个1=11 S(3)=21;即描述S(2)有2个1=21 ...
- Win7 VMWare 串口通信
下载安装工具: 1. 如果电脑(笔记本)没有串口接口,则需要使用一个 USB-Serial 转换线,这里使用 prolific usb-serial USB--串口转换线,首先需要在win7上安装对应 ...
- Javascript 事件冒泡
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范
工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考 我打算采用Information flow的方式自上而下,两大层分为基础层和展现层的结构.基础层分为多 ...
- [你必须知道的.NET]第二十九回:.NET十年(上)
发布日期:2009.05.08 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文部分内容,已 ...
- uva 12589 - Learning Vector
思路: 容易知道加向量的顺序是按向量斜率的大小顺序来的.由于数据不是很大,可以用背包解决!! dp[i][j]:加入最大面积为i时,加入了j个向量. 代码如下: #include<iostrea ...