题解:

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

会有奇数个焦点

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

然后状压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. cordova + Vue 开发 APP 上手指南

    什么是 cordova cordova 是由 Apache 基金会支持的,使用 HTML5 + CSS3 + JS 来构建多平台 APP 程序的开发框架.其支持调用手机系统(Android.IOS.W ...

  2. Eclipse Jee环境配置

    最近下载了新的Eclipse Jee Neon版本,记录一下如何进行开发环境的配置. 1.下载必要的开发环境文件 ①下载Java SE Development Kit (简称JDK) ②下载Tomca ...

  3. js判断手指的上滑,下滑,左滑,右滑,事件监听

    原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmove事件的时候,再获取此时手指的横坐标moveEndX和纵坐标moveEn ...

  4. word中的交叉引用

    分别使用“交叉引用”依次插入所需应用文献编号范围的第一个和最后一个. 所需引用处出现“[1][3]”   在引用处对两个编号操作:点击鼠标右键-选择“切换域代码”. [1]变为” {REF _Ref4 ...

  5. C语言转义字符基础总结

    C语言转义字符总结 C语言中的转义字符,是字符常量中很特别的一类.初学者容易在这方面犯错误,比如说我. 错题1 答案:C解析:每一个转义字符具有一个长度,这个字符串中:\t, \x43, \', \ ...

  6. redis安装配置:inux系统为centOS 64位

    下载Redis-4.0.6.tar.gz包 我下载的到自己的默认目录/root/software/下 1. 然后解压到这个目录下 /usr/local/src/ 解压命令: tar -xzf redi ...

  7. 雷林鹏分享:XML 树结构

    XML 树结构 XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶". 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: To ...

  8. ES7: 展开语法spread syntax:

    第一次遇到: payload = {...payload, manufacturer: state.manufacturers.filter(x => x._id === payload.man ...

  9. (GoRails)链接link_to到当前页current Page 并使用参数 (类ActionController::Parameters)

    https://gorails.com/episodes/rails-link-to-current-page-with-params?autoplay=1 如何链接到当前页并增加,移除,或者修改UR ...

  10. p1459 Sorting a Three-Valued Sequence

    如果将1和3都放到正确的位置,2自然也在正确的位置.那么统计1,2,3的数量num1,num2,num3.再看前num1个数有几个(设x个)不是1,那么x个1肯定要移.设前num1个数有y个3,最后n ...