是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近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 & 状态压缩的更多相关文章

  1. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  2. Travelling(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others ...

  3. HDU3001(KB2-J 状态压缩dp)

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. hdu 3006(状态压缩)

    The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 浅谈状态压缩DP

    浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...

  6. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  7. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  8. [HDU 4336] Card Collector (状态压缩概率dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...

  9. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

随机推荐

  1. MVC缓存01,使用控制器缓存或数据层缓存

    对一些浏览频次多.数据量大的数据,使用缓存会比较好,而对一些浏览频次低,或内容因用户不同的,不太适合使用缓存.   在控制器层面,MVC为我们提供了OutputCacheAttribute特性:在数据 ...

  2. oracle一点记录

    查看数据库实例名(SERVICE_NAME): sql: select instance_name from v$instance; 如何知道oracle客户端是32位还是64的.windows下启动 ...

  3. HTML5学习之画布和SVG(四)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. ASP.NET多线程下使用HttpContext.Current为null解决方案 2015-01-22 15:23 349人阅读 评论(0) 收藏

    问题一:多线程下获取文件绝对路径 当我们使用HttpContext.Current.Server.MapPath(strPath)获取绝对路径时HttpContext.Current为null,解决办 ...

  5. 安装wine的问题

  6. PMP 第十三章 项目干系人管理

    1.识别干系人是干什么?早期就识别干系人的原因是什么?识别干系人的输入和工具有哪些?干系人分析的几种模型是哪些?干系人登记册的内容有哪些?bbs.mypm.net 2.干系人参与程度的分类是怎样的?干 ...

  7. java学习笔记(2):获取文件名和自定义文件过滤器

    //自定义文件过滤器import java.io.File; import javax.swing.filechooser.*; public class JavaChooser extends Fi ...

  8. flex_高度补全

    一个高度为100px, 另外一个高度自动补全当前界面下剩余的高度: <!DOCTYPE html> <html lang="en"> <head> ...

  9. phpstudy配置ssl

    https://yunpan.cn/cPEyzVycbkiE3 (提取码:03aa) 1.重写规则:http://www.cnphp.info/htaccess-rewrite.html 2.相关文档 ...

  10. 记录Android Studio项目提交到github上的出错处理

    首先是按照网上的教程进行了一次提交,具体见http://web.gxzj.com.cn/News.aspx?id=325505 记得当时出现过这个错误Can't connect to reposito ...