power oj 2480 放积木[二进制状压DP]
题目链接【https://www.oj.swust.edu.cn/problem/show/2480】
题意:中文题目。
题解:二进制状态转移+坏点判断。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = << ;
LL dp[][maxn];
int mp[];
char s[];
int n, m;
int cur;
void DFS(int r, int pos, int nu, int z, int cnt)
{
if(pos == m)
{
dp[cur][nu] = max(dp[cur][nu], dp[cur ^ ][z] + cnt);
return ;
}
if(mp[r] & ( << pos)) //坏点
{
DFS(r, pos + , nu, z, cnt);
return ;
}
if(!(z & ( << pos)) && !(mp[r - ] & ( << pos)))
DFS(r, pos + , nu | ( << pos), z, cnt + );
else
{
if( pos && !(nu & ( << (pos - ))) && !(mp[r] & ( << (pos - ))) )
DFS(r, pos + , nu | ( << pos) | ( << (pos - )), z, cnt + );
DFS(r, pos + , nu, z, cnt);
}
}
int main ()
{
while(~scanf("%d%d", &n, &m))
{
memset(mp, , sizeof(mp));
for(int i = ; i <= n; i++)
{
scanf("%s", s);
for(int j = ; j < m; j++)
if(s[j] == '*') mp[i] |= << j;
}
cur = ;
memset(dp[], -, sizeof(dp[]));
int mask = ( << m) - ;
dp[][mask] = ;
for(int i = ; i <= n; i++)
{
cur ^= ;
memset(dp[cur], -, sizeof(dp[cur]));
for(int j = ; j <= mask; j++)
if(dp[cur ^ ][j] >= )
DFS(i, , , j, );
}
LL ans = ;
for(int i = ; i <= mask; i++)
ans = max(ans, dp[cur][i]);
printf("%lld\n", ans);
}
return ;
}
power oj 2480 放积木[二进制状压DP]的更多相关文章
- 计蒜客习题:蒜头君的积木 (状压DP 枚举子集)
问题描述 蒜头君酷爱搭积木,他用积木搭了 n 辆重量为 wi的小车和一艘最大载重量为 W 的小船,他想用这艘小船将 n 辆小车运输过河.每次小船运载的小车重量不能超过 W.另外,小船在运载小车时,每辆 ...
- Light OJ 1011 - Marriage Ceremonies(状压DP)
题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少? 状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...
- power oj 1557种树[二进制状压DP]
题目链接[https://www.oj.swust.edu.cn/problem/show/1557] 题意:中文题目. 题解:用0,1表示某个位置是否种了树,先算出同一行的有效状态的总数,即开两个1 ...
- [Swust OJ 581]--彩色的石子(状压dp)
题目链接:http://acm.swust.edu.cn/problem/0581/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接[http://poj.org/problem?id=2411] 题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方法? ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
- LibreOJ 6177 题解(状压DP)
题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- 江南OJ 1151 - 还是晒太阳 - [状压DP]
题目链接:校内OJ的题目,就不放链接了. PS.可以说是本次9月月赛唯一的一道有一定难度的题目了. 题解: 考虑状压DP,假设 $sta$ 是一个二进制数,代表当前 $n$ 个人有几个是在队伍里的,剩 ...
随机推荐
- hdu1205(类似 分布垃圾数列)
Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequen ...
- 【2013Esri全球用户大会精彩看点】Jack为您全面解读“GIS-Transforming Our World”
GIS正影响着最尖端的科学与技术,正改变着我们的世界. 1. GIS的带来的改变不只是物质世界的,还有观念方面. 当今世界面临各种挑战,我们要创造更美好的未来,需要智能的GIS.GIS改变了我 ...
- JavaScript设置简单的自动时间
下面就是一段简单的JavaScript设置简单的自动时间,时间显示在一个输入框input里面. <html> <head> </head> <body> ...
- Windows核心编程学习九:利用内核对象进行线程同步
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...
- 识别Andriod APK签名证书类型
转载请注明出处 根据已知Google证书的序列号来识别APK使用哪种证书签名的 目前只列出google原生签名,其他私有签名均视为presigned #!/bin/bash # Grab cert. ...
- Android仿人人客户端(v5.7.1)——新鲜事之完整篇
转载请标明出处: http://blog.csdn.net/android_ls/article/details/9228083 声明:仿人人项目,所用所有图片资源都来源于其它Androi ...
- Java NIO之内存映射文件——MappedByteBuffer
大多数操作系统都可以利用虚拟内存实现将一个文件或者文件的一部分"映射"到内存中.然后,这个文件就可以当作是内存数组来访问,这比传统的文件要快得多. 内存映射文件的一个关键优势是操作 ...
- Java 在本地文件中查找固定字符串
适用范围:只适用于在文本文档中查找(如,txt.java.c等等,并不适用与doc.xls等等这些文件),可嵌套文件夹.但是对中文不支持. 例如:文件夹:F:/demo 子文件夹:F:/demo/er ...
- C#中的集合类——ArrayList
1. ArrayList与数组 数组的长度不可变,元素的类型单一: ArrayList 实际上相当于一个可变长度的动态数组,由于集合中的元素都是object类型,元素的类型可以有多种了:与数组一样, ...
- JavaScript的事件机制
JavaScript的事件机制 摘要 事件是将JavaScript脚本与网页联系在一起的主要方式,是JavaScript中最重要的主题之一,深入理解事件的工作机制以及它们对性能的影响至关重要.本文将详 ...