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 ...
随机推荐
- Android中的单位及测试相关概念
android中的单位: in 英寸 pt 点距 px 像素 dp(dip) 密度无关的像素单位,自适应device屏幕的比例,通常涉及长宽高时采用 sp 与范围无关的像素单位,通常在设置字体大小时 ...
- 你自认为理解了JavaScript?
关于Dmitry Baranovskiy 的博客中一篇文章(http://dmitry.baranovskiy.com/post/91403200),其中有五段小代码,用来测试是否理解 JavaScr ...
- C#读书笔记之并行任务
这两天遇到一个多线程任务优化的问题,现在解决了,把心得用例子的形式记下来. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWe ...
- REST API 基于ACCESS TOKEN 的权限解决方案
REST 设计原则是statelessness的,而且但客户端是APP时,从APP发起的请求,不是基于bowers,无法带相同的sessionid,所以比较好的方案是每次请求都带一个accesstok ...
- Linux - 常用命令行(一)
今天和大家分享一些最基本常用命令行:也是作为新手最应该了解掌握的 ls 命令:用来显示指定工作目录下内容 dir命令:与ls命令一致 cd 命令:变化工作目录 pwd命令:显示用户当前的工作路径,显 ...
- dblink应用
当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据. 用法例子: (1) ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
- Hdu 1010 Tempter of the Bone 分类: Translation Mode 2014-08-04 16:11 82人阅读 评论(0) 收藏
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- setsockopt中参数之SO_REUSEADDR的意义(转)
转 http://www.cnblogs.com/qq78292959/archive/2013/01/18/2865926.html setsockopt中参数之SO_REUSEADDR的意义(转 ...
- Unity3d之音效播放和调用手机震动
http://blog.csdn.net/sunshine_1984/article/details/12943979 今天研究了下Unity3d音效播放相关内容,整理下实现细节. 1,添加音效文件到 ...