Petya and Spiders【二进制状压】
题目链接【http://codeforces.com/problemset/problem/111/C】
题意:给出大小为N*M的图(1 ≤ n, m ≤ 40, n·m ≤ 40),每个图中有一个蜘蛛,每个蜘蛛有5种运动状态,不动,向上下左右移动。问蜘蛛如何移动才能使得图中的空地数最大,输出最大空地数。
题解:虽然(1 ≤ n, m ≤ 40, n·m ≤ 40),但是当(n<m)的时候可以swap(n,m),对结果是没有影响的。用一个二进制数表示每一行的每个位置的状态。最多有(1<<6)-1种状态,如果该位置是1 表示该位置可以容纳蜘蛛,反之不能放入蜘蛛。
dp[i][j][k]为第i行的状态为j,i+1行的状态为k的空位数。 dp[i + 1][k][l] = max(dp[i + 1][k][l], dp[i][j][k] + nu[k]);这个第(i+1)行的转移方程是满足在第i、第(i+1)行、第(i+2)行的状态使得(i+1)行的蜘蛛的有去处。最后取DP[n][i][0]的最大值。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = << ;//6*7=42;
int dp[][maxn][maxn];//dp[i][j][k]为第i行的状态为j,i+1行的状态为k的空位数
int nu[maxn];
int n, m, lim;
bool OK (int a, int b, int c)
{
int t = b | (b << ) | (b >> ) | a | c;
return (t&lim) == lim;
}
int main ()
{
scanf("%d%d", &n, &m);
if(n < m) swap(n, m);
memset(dp, -, sizeof(dp));
lim = ( << m) - ;
for(int i = ; i <= lim; i++)
{
dp[][][i] = ;
int t = i;
while(t)
{
if(t & ) nu[i]++;
t >>= ;
}
nu[i] = m - nu[i];
}
for(int i = ; i < n; i++)
for(int j = ; j <= lim; j++) //i行的状态
for(int k = ; k <= lim; k++) //i+1行的状态
if(dp[i][j][k] != -)
{
for(int l = ; l <= lim; l++) //i+2行的状态
if(OK(j, k, l))
dp[i + ][k][l] = max(dp[i + ][k][l], dp[i][j][k] + nu[k]);
}
int ans = ;
for(int i = ; i <= lim; i++)
ans = max(ans, dp[n][i][]);
printf("%d\n", ans);
return ;
}
Petya and Spiders【二进制状压】的更多相关文章
- power oj 2480 放积木[二进制状压DP]
题目链接[https://www.oj.swust.edu.cn/problem/show/2480] 题意:中文题目. 题解:二进制状态转移+坏点判断. #include<cstdio> ...
- power oj 1557种树[二进制状压DP]
题目链接[https://www.oj.swust.edu.cn/problem/show/1557] 题意:中文题目. 题解:用0,1表示某个位置是否种了树,先算出同一行的有效状态的总数,即开两个1 ...
- 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] ...
- P1558 色板游戏 线段树+二进制状压
好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...
- UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举
题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...
- 状压DP天秀
状压DP,依靠的是把状态用某种压缩方式表示出来进而DP,大多数时候是二进制状压. 直接看例题吧. 一双木棋 九尾狐吃棉花糖 islands and bridges 愤怒的小鸟 芯片 ...
- ACM学习历程—ZOJ 3777 Problem Arrangement(递推 && 状压)
Description The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem sett ...
- 状态压缩dp 状压dp 详解
说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...
随机推荐
- C/C++ 内存对齐
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- C语言之总结1
1). 终端常用的命令: pwd 显示终端的工作路径. ls list 清单 显示当前工作路径下的所有的文件以及文件夹. ls -l 以详细信息显示当前工作路径下的所有的文件以及文件夹. cd 要切 ...
- labview 调用 matlab script的神坑! Error 1050 occurred at LabVIEW
显示变量没有被定义,原因是clear 关键字的问题,去掉即可!!! 未找到 文件路径,定位: 文件路径中不能有中文路径
- Smallest multiple
problem 5:Smallest multiple 题意:求最小的正数,使得其可以被1-20整除 代码如下: #ifndef PRO5_H_INCLUDED #define PRO5_H_INCL ...
- sed常见用法,删除匹配行的上2行,下3行
删除匹配的下一行到最后一行 [root@test200 ~]# cat test a b c d e f [root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test ...
- IntelliJ IDEA 设置代码提示或自动补全的快捷键 (附IntelliJ IDEA常用快捷键)
修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...
- Javascript赋值语句中的“&&”操作符和"||"操作符
有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...
- Object-Widgets-Quick 构造树
Object Tree 当以某个QObject为父类创建一个QObject时, 它会被添加到该父类的children列表中. 析构时, QObjet 会首先检查自己的children, 依次析构, 然 ...
- 第12章 MySQL高级管理
1.手动更新权限后,需向服务器指出已对权限进行修改: (在MySQL提示符下)flush privileges; 2.查看用户所拥有的权限: 如: show grants for bookorama; ...
- 上锁 - leetcode
158. Read N Characters Given Read4 II - Call multiple times 题目: The API: int read4(char *buf) reads ...