1294: [SCOI2009]围豆豆Bean

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 458  Solved: 305
[Submit][Status][Discuss]

Description

Input

第一行两个整数N和M,为矩阵的边长。 第二行一个整数D,为豆子的总个数。 第三行包含D个整数V1到VD,分别为每颗豆子的分值。 接着N行有一个N×M的字符矩阵来描述游戏矩阵状态,0表示空格,#表示障碍物。而数字1到9分别表示对应编号的豆子。

Output

仅包含一个整数,为最高可能获得的分值。

Sample Input

3 8
3
30 -100 30
00000000
010203#0
00000000

Sample Output

38

HINT

50%的数据满足1≤D≤3。
100%的数据满足1≤D≤9,1≤N, M≤10,-10000≤Vi≤10000。

从每个豆豆射出一条射线,若经过路线奇数次则说明路线将其包围,若经过偶数次则不包围。

设状态f[i][j][k]表示到达(i,j)围豆豆状态为k的最大价值。

每次枚举起点,用spfa转移即可。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 15
using namespace std;
int tx[]={,-,,};
int ty[]={,,,-};
char a[maxn];
int num[maxn][maxn];
int val[maxn];
int n,m,d;
int x[maxn],y[maxn];
int f[maxn][maxn][];
int inq[maxn][maxn][];
int ans=;
struct data {
int x,y,z;
}q[];
void work(int i,int j) {
memset(f,-,sizeof(f));
int head=,tail=;
q[]=(data){i,j,};
f[i][j][]=;
while(head!=tail) {
data now=q[head++];if(head==) head=;
if(now.x==i&&now.y==j) ans=max(ans,f[now.x][now.y][now.z]);
for(int k=;k<;k++) {
int tox=now.x+tx[k],toy=now.y+ty[k],toz=now.z;
int add=;
if(tox<||toy<||tox>n||toy>m||num[tox][toy]!=) continue;
if(now.x!=tox) {
data temp;
if(tox>now.x) temp=(data){now.x,now.y,now.z};else temp=(data){tox,toy,now.z};
for(int l=;l<=d;l++) {
if(temp.y>y[l]&&temp.x==x[l]) {
temp.z^=(<<(l-));
if(temp.z&(<<(l-))) add+=val[l];
else add-=val[l];
}
}
toz=temp.z;
}
if(f[tox][toy][toz]<f[now.x][now.y][now.z]+add-){
f[tox][toy][toz]=f[now.x][now.y][now.z]+add-;
if(!inq[tox][toy][toz]) {
q[tail++]=(data){tox,toy,toz};if(tail==) tail=;
inq[tox][toy][toz]=;
}
}
inq[now.x][now.y][now.z]=;
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=d;i++) scanf("%d",&val[i]);
for(int i=;i<=n;i++) {
scanf("%s",a+);
for(int j=;j<=m;j++) {
if(a[j]=='') num[i][j]=;
else if(a[j]!='#') x[a[j]-'']=i,y[a[j]-'']=j,num[i][j]=-;
else num[i][j]=;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(num[i][j]==) work(i,j);
printf("%d",ans);
return ;
}

[BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa的更多相关文章

  1. 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA

    [BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...

  2. 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)

    [BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...

  3. BZOJ1294: [SCOI2009]围豆豆Bean

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294 状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路. 然后判断一 ...

  4. bzoj1294 [SCOI2009]围豆豆

    Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...

  5. HDU 4284 状压dp+spfa

    题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...

  6. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  7. 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)

    题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...

  8. BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何

    显然我们不可能表示出一台路径,因为实在是太复杂了. 所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径. 所以我们考虑状压一下所有的豆子有没有被 ...

  9. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

随机推荐

  1. 5.bootstrap栅格 清除浮动

    只要用到栅格,就注意要清除浮动,清除方法就是在父元素的class上加一个clearfix 1.情景: . <div class="col-sm-7"> <div ...

  2. codility

    // you can also use imports, for example: // import java.util.*; // you can write to stdout for debu ...

  3. Jenkins拾遗--第四篇-适当的让构建失败

    问题的引出: 有一段我们的前端构建总会现git上分支名称中的版本号和工程里的版本号不一致的问题:这样会导致构一个问题:构建后的产品名称叫做1.1,但是进入app的关于页面,看到的版本还是1.0.这会让 ...

  4. 《Cracking the Coding Interview》——第13章:C和C++——题目8

    2014-04-25 20:27 题目:实现一个能够通过引用计数来实现自动回收数据的智能指针,用C++,不是java. 解法:这题真心牛,我的第一反应是发呆,因为对引用计数的了解仅限于这个名词,完全没 ...

  5. 《Cracking the Coding Interview》——第4章:树和图——题目9

    2014-03-19 05:07 题目:给定一棵二叉树T和一个值value,在T中找出所有加起来和等于value的路径.路径的起点和终点都可以是树的任意节点. 解法:我偷了个懒,直接把这棵树看成一个无 ...

  6. iOS-QQ好友列表实现

    0.QQ好友列表实现 0.首先说说实现思路 自定义UITableView,每一个分组都是一个UITableViewHeaderFooterView,然后自定义cell,这里分组的实现主要是自定义UIT ...

  7. Python学习-django-ModelForm组件

    ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...

  8. Entity Framework(二)

    1. ORM :Object Relation Mapping ,通俗说:用操作对象的方式来操作数据库. 2. 插入数据不再是执行Insert,而是类似于 Person p=new Person() ...

  9. python 常见的错误类型 和 继承关系

    BaseException +-- SystemExit #系统结束 +-- KeyboardInterrupt #键盘中断 ctrl+D +-- GeneratorExit #主动结束 +-- Ex ...

  10. ComboBox列表自定义类保存数据

    之前没弄明白ComboBox还可以这样用. 先建一个ComboBox子项类,然后可以获取该项类做一些判断,关键是要重写ToString()方法. public class ComboItem { pu ...