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,是很容易看出来的,然后由 ...
随机推荐
- traceroute
把跳数设置为10次: ]# traceroute -m www.baidu.com traceroute to www.baidu.com ( hops max, byte packets 10.10 ...
- 深入理解SELinux SEAndroid
参考文章: 一. http://blog.csdn.net/innost/article/details/19299937 二. http://blog.csdn.net/innost/article ...
- oracle的oci和thin区别(数据源)
我是今天看到tomcat数据源的配置时,想起来这个问题,刚开始还不晓得thin是什么东西! database.url=jdbc:oracle:thin:angel/oracle@192.168.55. ...
- httpclient 4.5 get请求
还是官网靠谱啊 package com.test.httpclient.getpost; import java.io.IOException; import java.util.ArrayList; ...
- WebStorm 有哪些过人之处?
作者:方应杭链接:https://www.zhihu.com/question/20936155/answer/16654794来源:知乎著作权归作者所有,转载请联系作者获得授权. 先说缺点吧: 常驻 ...
- ora-01033:oracle initializationg or shutdown in progress 错误提示解决方法
1.进入CMD,执行set ORACLE_SID=fbms,确保连接到正确的SID:2.运行sqlplus "/as sysdba" SQL>shutdown immedia ...
- lvs+keepalived 负载均衡
LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡.LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器.目前有三种IP负 载均衡技术(VS/NAT.VS/T ...
- C# 创建Windows Service
当我们需要一个程序长期运行,但是不需要界面显示时可以考虑使用Windows Service来实现.这篇博客将简单介绍一下如何创建一个Windows Service,安装/卸载Windows Servi ...
- poj 2337 欧拉回路输出最小字典序路径 ***
把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...
- 在IIS上部署SSL
背景: 在处理DropboxAPI开发时,其重定向的URL地址必须是https的[除了localhost],不得已在自己网站上加了ssl,下面简单介绍下添加自签名证书,毕竟只是临时使用. 1.打开II ...