题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294

状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路。

然后判断一个点是否在区间内用射线法(向右射出一条射线,如果穿过的边界是奇数就算,偶数则不算。

然后枚举起点跑最短路就可以了。

(傻叉错误调半天TAT

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<queue>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std;
struct data{int x,y,z;
};
int dx[]={,,,-},dy[]={,,-,};
int mp[][],dis[][][],d[][][],vis[][][],v[],p[][],bin[];
int n,m,D,tot,ans;
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
int get(int s,int x,int y,int xx,int yy){
int ans=s;
rep(i,,D) {
int nowx=p[i][],nowy=p[i][];
if (yy>nowy&&((x<=nowx&&xx>nowx)||(x>nowx&&xx<=nowx))) ans=ans^bin[i-];
}
return ans;
}
void spfa(int x,int y){
queue<data> q;
clr(dis,); clr(vis,); dis[][x][y]=; q.push((data){x,y,});
while (!q.empty()){
data u=q.front(); q.pop(); vis[u.z][u.x][u.y]=;
rep(i,,){
int vx=u.x+dx[i],vy=u.y+dy[i];
if (mp[vx][vy]!=) continue;
int tmp=get(u.z,u.x,u.y,vx,vy);
if (dis[tmp][vx][vy]>dis[u.z][u.x][u.y]+) {
dis[tmp][vx][vy]=dis[u.z][u.x][u.y]+;
if (!vis[tmp][vx][vy]){
vis[tmp][vx][vy]=;
q.push((data){vx,vy,tmp});
}
}
}
vis[u.z][u.x][u.y]=;
}
rep(i,,(<<D)-) {
int tmp=-dis[i][x][y];
rep(j,,D) if (i&bin[j-]) tmp+=v[j];
ans=max(ans,tmp);
}
}
int main(){
bin[]=; rep(i,,) bin[i]=bin[i-]*;
n=read(); m=read();
D=read();
rep(i,,D) v[i]=read();
clr(mp,-);
rep(i,,n) rep(j,,m){
char ch=getchar(); while (!isdigit(ch)&&ch!='#') ch=getchar();
if (ch=='#') continue;
else mp[i][j]=ch-'';
if (ch!='') p[ch-''][]=i,p[ch-''][]=j;
}
ans=;
rep(i,,n) rep(j,,m)
if (mp[i][j]==)spfa(i,j);
printf("%d\n",ans);
return ;
}

BZOJ1294: [SCOI2009]围豆豆Bean的更多相关文章

  1. [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa

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

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

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

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

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

  4. bzoj1294 [SCOI2009]围豆豆

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

  5. 【BZOJ】1294: [SCOI2009]围豆豆Bean

    题解 随机跳题真好玩 这个就是考虑我们怎么判断点在多边形内,就是点做一条射线,穿过了奇数条边 我们只需要记录一个二进制状态表示每个点的射线穿过路径的次数的奇偶性 枚举起点,然后用BFS的方式更新dp状 ...

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

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

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

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

  8. [SCOI2009]围豆豆

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

  9. 【题解】SCOI2009围豆豆

    很久之前就很想做的一道题,一直思考到今天才下定决心看题解.这道题中,很关键的一点就在于:如何判断一个点是否在一个多边形内?其实如果计算几何基本功扎实的话,应该是可以很快给出答案的(可惜我完全不行):由 ...

随机推荐

  1. OC学习10——内存管理

    1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...

  2. 基于阿里云的MQTT远程控制

    好久没有写博客了,眼看自己的项目就要快做完了,先分享一下基于MQTT的远程控制,自己买了一个阿里的云端,然后在云端上安装了一个MQTT服务器,其实是一不小心买了两个,所以准备贡献出来一个供大家使用, ...

  3. bzoj 3718: [PA2014]Parking

    Description 你的老板命令你将停车场里的车移动成他想要的样子. 停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直 ...

  4. 深入理解 React JS 中的 setState

    此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...

  5. IE下判断IE版本的语句...[if lte IE 8]……[endif]

    <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见   <!--[if lte IE 7]> <![endif]--> ...

  6. KVO键值观察的具体实现

    1.KVO简介 KVO是Objective-C对观察者设计模式的一种实现,它提供一种机制,指定一个被观察对象(如A类),当对象中的某个属性发生变化的时候,对象就会接收到通知,并作出相应的处理.在MVC ...

  7. TensorFlow 基础知识

    参考资料: 深度学习笔记目录 向机器智能的TensorFlow实践 TensorFlow机器学习实战指南 Nick的博客 TensorFlow 采用数据流图进行数值计算.节点代表计算图中的数学操作,计 ...

  8. c=$[$c%5]到let c=$c%5的转换

    刚学shell不知道怎么转换,现在明白了一点点 ,记录下   变成加法就好明白了     c=$[$c+5] let c=$c+5 #变量c等于C加上5后在赋值给自身 let c+=5 #就可以这样表 ...

  9. volatile关键字的特性总结

    当一个变量定义为volatile后,它将具备两个特性: 1.保证此变量对所有线程的可见性,所谓"可见性",,是指当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的. ...

  10. Micro Templating源码分析

    关于模板,写页面的人们其实一直在用,asp.net , jsp , php, nodejs等等都有他的存在,当然那是服务端的模板. 前端模板,作为前端人员肯定是多少有接触的,Handlebars.js ...