sdoi 2009 & 状态压缩
是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧。
游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值Vi。游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到起始格。最终游戏者的得分为所有被路径围住的豆豆的分值总和减去游戏者移动的步数。矩阵中某些格子内设有障碍物,任何时刻游戏者不能进入包含障碍物或豆子的格子。游戏者可能的最低得分为0,即什么都不做。
注意路径包围的概念,即某一颗豆在路径所形成的多边形(可能是含自交的复杂多边形)的内部。下面有两个例子:

第一个例子中,豆在路径围成的矩形内部,所以豆被围住了。第二个例子中,虽然路径经过了豆的周围的8个格子,但是路径形成的多边形内部并不包含豆,所以没有围住豆子。
布布最近迷上了这款游戏,但是怎么玩都拿不了高分。聪明的你决定写一个程序来帮助他顺利通关。
SOL:
这题D=9,就算你不知道DP怎么写也知道这是撞鸭了,9,多么好的数字,2^9也不大.
撞鸭打的少,自己打的代码调的我想吐血.贴一发翁神的代码,既直观又美观,就算你从来不知道什么是撞鸭你也知道什么使撞鸭了....
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define maxn 12
#define maxs 512
const int dx[] = {0, -1, 0, 1};
const int dy[] = {-1, 0, 1, 0};
using namespace std;
int n, m, d, val[maxn], px[maxn], py[maxn], f[maxn][maxn][maxs];
int ans, nx, ny, ns, nw, up;
bool v[maxn][maxn][maxs];
char map[maxn][maxn];
struct node{
int x, y, s;
node(){}
node(int _x, int _y, int _s){ x = _x; y = _y; s = _s;}
}now;
queue<node> q;
void add(int x, int y, int s, int w)
{
v[x][y][s] = 1; f[x][y][s] = w;
q.push(node(x, y, s));
}
void solve(int sx, int sy)
{
memset(f, -0x3f, sizeof(f));
memset(v, 0, sizeof(v));
while (! q.empty()) q.pop();
add(sx, sy, 0, 0);
while (! q.empty()){
now = q.front(); q.pop();
for (int i = 0; i < 4; ++ i){
nx = now.x + dx[i]; ny = now.y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && map[nx][ny] == '0'){
ns = now.s; nw = f[now.x][now.y][now.s] - 1;
if (abs(dx[i]) == 1){
up = min(now.x, nx);
for (int j = 1; j <= d; ++ j)
if (px[j] == up && py[j] > ny){
ns ^= (1 << (j - 1));
if ((ns & (1 << (j - 1)))) nw += val[j]; else nw -= val[j];
}
}
if (! v[nx][ny][ns]) add(nx, ny, ns, nw);
}
}
}
for (int i = 0; i < (1 << d); ++ i)
ans = max(ans, f[sx][sy][i]);
}
int main()
{
scanf("%d%d", &n, &m); scanf("%d", &d);
for (int i = 1; i <= d; ++ i) scanf("%d", &val[i]);
for (int i = 1; i <= n; ++ i){
scanf("%s", map[i] + 1);
for (int j = 1; j <= m; ++ j)
if (map[i][j] >= '1' && map[i][j] <= '9'){
px[map[i][j] - '0'] = i; py[map[i][j] - '0'] = j;
}
}
for (int sx = 1; sx <= n; ++ sx)
for (int sy = 1; sy <= n; ++ sy)
if (map[sx][sy] == '0') solve(sx, sy);
printf("%d\n", ans);
return 0;
}
sdoi 2009 & 状态压缩的更多相关文章
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- Travelling(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others ...
- HDU3001(KB2-J 状态压缩dp)
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 3006(状态压缩)
The Number of set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 浅谈状态压缩DP
浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
随机推荐
- linux查看常用操作
linux下查看文件夹以及文件的大小: df命令可以显示目前所有文件系统的可用空间及使用情形 df -h Filesystem Size Used Avail Use% Mounted on /dev ...
- Delphi数组
参考:http://www.cnblogs.com/huangjacky/archive/2009/12/21/1628833.html 数组就是一堆相同特性数据的一个组合,也就是每个元素的类型必须是 ...
- 【JAVA与XML、dtd约束、Schema约束】
一.XML. (1)XML:Extensible Markup Language (2)XML是一种标记语言. (3)XML的设计宗旨是传输数据,而不是显示数据. (4)XML标签没有被预定义,即使用 ...
- 异常:System.BadImageFormatException,未能加载正确的程序集XXX
IDE:VS2015 语言:C# 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项... 一般是由于目标程序的目标平台与其某一依赖项的目标编 ...
- Linux 6.5網卡配置
Linux 6.5 網卡配置 路徑:/etc/sysconfig/network-scripts 1.關閉NetworkManager服務 [root@rhcsasm2 network-scripts ...
- 咱就入个门之NHibernate映射文件配置(二)
上一篇主要介绍了NHibernate映射文件的基础配置,这篇我们介绍下NHibernate的一对多及多对一配置(文中我直接使用双向关联,即一和多两端都配置,开发中可以只使用一端),同时略带介绍下NHi ...
- DOM、Window对象操作
一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, v ...
- Android开发中Handler的经典总结
当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发. AD: 一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线 ...
- linux服务器init 5启动图形界面,报错Retrigger failed udev events
今天因工作需要开启linux系统的桌面环境,使用startx未成功,报如下错误: [root@ /]# startx xauth: creating new authority xinit: No s ...
- Java Math floor round ceil 函数
public final class Math extends Object public static double floor(double a) public static long round ...