【scoi2009】围豆豆(最短路模型)
洛谷题面:https://www.luogu.org/problemnew/show/P2566
由每个豆子引一条射线,与射线交点个数为奇数相当于多边形围住了它,这样可以定义一个状态f[x][y][s]表示从起点出发,走到(x,y)处时的路径与D颗豆子引出的射线相交的奇偶性状态为s,最少需多少步。然后跑最短路转移即可。
然而,有一个小问题就是转移时如何判与豆子引出的射线相交。如果单纯按与线相交的拐点来计算的话,我们发现会有这两种截然不同的情况被算成了一样。
理论上蓝色路径应该是0,绿色路径应该是1才对。
于是我们可以选择统计时把边定一下向,像绿色路径这种穿出的情况就不重复计算了。详见代码。
#include<bits/stdc++.h>
using namespace std;
const int N = 15;
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
int n,m,w[N],val[1<<10],D;
char mp[N][N];
int dis[N][N][1<<10],ans;
struct la{int x,y,s;}bean[N];
queue<la> q;
bool vis[N][N][1<<10];
int rx[4]={0,1,0,-1};
int ry[4]={1,0,-1,0};
inline bool isin(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
inline void spfa(int x,int y){
memset(dis,0x3f,sizeof(dis));
q.push((la){x,y,0});dis[x][y][0]=0;vis[x][y][0]=1;
while(!q.empty()){
la u=q.front();q.pop();vis[u.x][u.y][u.s]=0;
rep(i,0,3){
int nx=u.x+rx[i],ny=u.y+ry[i],ns=u.s;
if(!isin(nx,ny)||mp[nx][ny]!='0')continue;
rep(j,0,D-1){
if(ny>bean[j].y&&((nx==bean[j].x&&u.x>bean[j].x)||(nx>bean[j].x&&u.x==bean[j].x)))ns^=(1<<j);
}
if(dis[nx][ny][ns]>dis[u.x][u.y][u.s]+1){
dis[nx][ny][ns]=dis[u.x][u.y][u.s]+1;
if(vis[nx][ny][ns])continue;
vis[nx][ny][ns]=1;
q.push((la){nx,ny,ns});
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
scanf("%d",&D);
rep(i,0,D-1){
scanf("%d",&w[i]);
}
rep(j,0,(1<<D)-1){
rep(i,0,D-1){
if(j&(1<<i))val[j]+=w[i];
}
}
rep(i,1,n){
scanf("%s",mp[i]+1);
rep(j,1,m){
if(mp[i][j]>'0')bean[mp[i][j]-'0'-1]=(la){i,j,0};
}
}
rep(i,1,n){
rep(j,1,m){
if(mp[i][j]!='0')continue;
spfa(i,j);
rep(k,0,(1<<D)-1)ans=max(ans,val[k]-dis[i][j][k]);
}
}
printf("%d\n",ans);
return 0;
}
【scoi2009】围豆豆(最短路模型)的更多相关文章
- 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
[BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
[BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...
- [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa
1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 458 Solved: 305[Submit][Sta ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...
- BZOJ1294: [SCOI2009]围豆豆Bean
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294 状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路. 然后判断一 ...
- [SCOI2009]围豆豆
Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...
- 【题解】SCOI2009围豆豆
很久之前就很想做的一道题,一直思考到今天才下定决心看题解.这道题中,很关键的一点就在于:如何判断一个点是否在一个多边形内?其实如果计算几何基本功扎实的话,应该是可以很快给出答案的(可惜我完全不行):由 ...
- BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何
显然我们不可能表示出一台路径,因为实在是太复杂了. 所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径. 所以我们考虑状压一下所有的豆子有没有被 ...
- 【状态压缩DP】SCOI2009 围豆豆
题目大意 洛谷链接 在一个\(N×M\)的矩阵方格内分布着\(D\)颗豆子,每颗豆有不同的分值\(V_i\).游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到 ...
- 【BZOJ】1294: [SCOI2009]围豆豆Bean
题解 随机跳题真好玩 这个就是考虑我们怎么判断点在多边形内,就是点做一条射线,穿过了奇数条边 我们只需要记录一个二进制状态表示每个点的射线穿过路径的次数的奇偶性 枚举起点,然后用BFS的方式更新dp状 ...
随机推荐
- [Cypress] Create True end-to-end Tests with Cypress (Smoke test)
Integration tests let us keep our tests fast and reliable. They also allow us to test scenarios that ...
- umask函数的使用方法 - 怎样进行权限位的设置
以下程序创建了两个文件,创建foo文件时,umask值为0,创建第二个时,umask值禁止全部组和其它用户的訪问权限. 測试结果: 測试结果能够看出更改进程的文件模式掩码并不影响其父进程(经常是she ...
- Android之使用MediaMetadataRetriever类获取视频第一帧
一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类.大家能够 ...
- FreeBSD内核之中的一个 ALQ机制的使用
背景: 笔者由于一个项目,这段时间在使用FreeBSD进行内核模块的编程. 之前做过一段时间的Linux下驱动模块编程.对Linux下的模块编程还算熟悉. 如今突然转到FreeBSD下.尽管Linux ...
- 【POJ 3740】 Easy Finding
[题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...
- 前端面试准备之JavaScript
1.数据类型. JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String.还有1种复杂数据类型——Object,Obje ...
- HTTP权威协议笔记-10.HTTP-NG
1.HTTP发展中存在的问题 复杂性 其连接.报文.及功能逻辑之间的混合使用相当复杂,使用容易出错 可扩展性 传统流行下来的http应用很难实现扩展性,且无法兼容 性能 高延时.低吞吐 ...
- Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流
题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...
- [BZOJ1307][ZJOI2008]生日聚会PARTY
...一开始用了三维的...甚至尝试把它搞成二维的...后来发现根本没法转移呀... 既然dalao说这是初中题,那它就算是一道初中题吧... dp[i][j][k][p]表示当前有i个男生j个女生, ...
- ACM_鸡兔同笼(二元一次方程)
鸡兔同笼 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今有雉兔同笼,上有n头,下有m足,问雉兔各几何? Input: 输入有多 ...