题解:

首先发现假如一个豆豆被多边形围住了,那么从这个豆豆引出一条射线

会有奇数个焦点

然后我们从每个豆豆引出一条射线

然后状压dfs

代码:

#include<bits/stdc++.h>
using namespace std;
const int c[][]={{,},{,-},{,},{-,}};
struct point{int cx,cy,x,y;}b[];
int n,m,d,ans,x,w[],dis[][][];
char mp[][];
struct node{int i,j,s;};
queue<node> q;
int cross(int x,int y,int nx,int ny,int s)
{
for (int i=;i<=d;i++)
if (((x<b[i].cx&&nx>=b[i].cx)||(x>=b[i].cx&&nx<b[i].cx))&&y>b[i].cy)s^=<<(i-);
return s;
}
void spfa(int sx,int sy)
{
q.push((node){sx,sy,});
memset(dis,0x3f,sizeof(dis));
dis[sx][sy][]=;
while (!q.empty())
{
node x=q.front();
q.pop();
for (int k=;k<;k++)
{
int nx=x.i+c[k][],ny=x.j+c[k][];
if (nx<||nx>n||ny<||ny>m||mp[nx][ny]!=) continue;
int s=cross(x.i,x.j,nx,ny,x.s);
if (dis[nx][ny][s]>dis[x.i][x.j][x.s]+)
{
dis[nx][ny][s]=dis[x.i][x.j][x.s]+;
q.push((node){nx,ny,s});
}
}
}
for (int i=;i<<<d;i++)
{
int res=-dis[sx][sy][i];
for (int j=;j<=d;j++)
if (i&(<<(j-))) res+=w[j];
ans=max(ans,res);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&d);
for (int i=;i<=d;i++) scanf("%d",&w[i]);
for (int i=;i<=n;i++)
{
scanf("%s",mp[i]+);
for (int j=;j<=m;j++)
if (mp[i][j]>&&mp[i][j]<=)
{
x=mp[i][j]-'';
b[x]=(point){i,j,,j+};
}
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (mp[i][j]==)spfa(i,j);
printf("%d\n",ans);
}

bzoj1294的更多相关文章

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

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

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

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

  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. [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa

    1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 458  Solved: 305[Submit][Sta ...

  6. bzoj1294题解

    [题意分析] 给定一张网格图,每个网格可能是普通点.特殊点或障碍点,每个特殊点有一个分值.要求选定一条只经过普通点的可重复回路,使回路内部的特殊点分值和最大. [算法分析] 引理:射线法 对于平面内任 ...

  7. 【状压dp】Bzoj1294 围豆豆

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

  8. BZOJ1294 洛谷P2566 状态压缩DP 围豆豆

    传送门 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值 ...

随机推荐

  1. gradlew 的https代理设定

    在内网编译vlc for Android 时, 总是在 [./gradlew assemble] 卡住, 在网上找到了设置代理的方法: 在gradlew 的同一目录,建立一个 gradle.prope ...

  2. feign三:覆写feign的默认配置及feign的日志

    feign三:覆写feign的默认配置及feign的日志 默认配置复写 本项目地址:http://192.168.1.103:7601 本例是通过feign调用 eureka项目中的/eureka/a ...

  3. [转] @JoinColumn 详解 (javax.persistence.JoinColumn)

    原文链接:@JoinColumn详解  原文标的也是转载,但是没有注明原文链接,看起来乱乱的,所以整理一下转载过来,顺便细看一下 1. 一对一 现假设有Person表和Address表,是一对一的关系 ...

  4. 恶意代码分析-使用apataDNS+inetsim模拟网络环境

    准备工作 虚拟机安装: Win7 Ubuntu apateDNS 密码:wplo inetsim 密码:ghla 客户端Win7需要做的工作 安装apateDNS 服务器端Ubuntu需要做的工作 下 ...

  5. 胜利大逃亡 HDU - 1253

    Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0 ...

  6. http认证中的nonce与timestamp解释

    Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端:客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5.SHA1等等),然后将这个加密后的字符串和用户 ...

  7. 『流畅的Python』第10章笔记_序列类型

    一.基础知识 “__”前缀:私有属性.方法,在__dict__中存储时被改写为“_类名__”前缀 “_”前缀:是约定俗成的保护属性.方法,不过编译器不会对之采取任何处理 二.class特殊方法介绍 在 ...

  8. k8s相关端口表-以及周边工具

    k8s端口 kube-api 6443 kube-controller-manager 10252 kube-scheduler 10251 kubelet 10250 kube-proxy 1025 ...

  9. 向java高级工程师和项目经理的道路进发【转】

    转自https://www.cnblogs.com/ahudyan-forever/p/5263296.html 宏观 一. JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或 ...

  10. 四则运算Java语言实验设计过程1

    题目要求: 像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”.要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性).题目避免重复.可定制出题的数量. 设计思路 ...