BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何
显然我们不可能表示出一台路径,因为实在是太复杂了。
所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径。
所以我们考虑状压一下所有的豆子有没有被围起来,然后判定的方法是随便引出一条射线,判断和多边形的交点的个数,我们只需要记录奇偶性,所以直接状压即可。
然后枚举起点,宽度优先搜索处理之后,计算所有影响下的最优答案即可。
为了方便转移,我们选择豆子向上偏右的方向的射线作为判断。
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair int v[10],n,m,d,ret=0;
int dis[11][11][1<<10];
char s[20];
int map[12][12],x[10],y[10];
int mov[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
queue <int> qx,qy,qs; void print(int x)
{
F(i,0,d-1) printf("%d",(x>>i)&1);
} int main()
{
scanf("%d%d%d",&n,&m,&d);
F(i,0,d-1) scanf("%d",&v[i]);
F(i,1,n)
{
scanf("%s",s+1);
F(j,1,m)
{
switch(s[j])
{
case '0': map[i][j]=0;break;
case '#': map[i][j]=-1;break;
default:x[s[j]-'1']=i;y[s[j]-'1']=j;map[i][j]=-1;break;
}
}
}
// F(i,0,d-1) printf("Bean (%d,%d)\n",x[i],y[i]);
F(i,0,m+1) map[0][i]=map[n+1][i]=-1;
F(i,0,n+1) map[i][0]=map[i][m+1]=-1;
// F(i,0,n+1) F(j,0,m+1) printf("%5d%c",map[i][j],j==m+1?'\n':' ');
F(sx,1,n) F(sy,1,m)
{
memset(dis,0x3f,sizeof dis);
qx.push(sx);qy.push(sy);qs.push(0);dis[sx][sy][0]=0;
while (!qx.empty())
{
int nx=qx.front(),ny=qy.front(),ns=qs.front();
// printf("now is %d %d ",nx,ny); print(ns); printf("\n");
qx.pop();qy.pop();qs.pop();
if (nx==sx&&ny==sy)
{
int ans=-dis[nx][ny][ns];
F(i,0,d-1) if (ns&(1<<i)) ans+=v[i];
ret=max(ret,ans);
}
F(k,0,3)
{
int tx=nx+mov[k][0],ty=ny+mov[k][1];
// printf("(%d,%d) to (%d,%d) k is %d\n",nx,ny,tx,ty,k);
if (map[tx][ty]!=-1)
{
int ts=ns;
F(i,0,9)
{
if ((k==0&&(ty==y[i]+1&&tx<x[i]))
||(k==1&&(ty==y[i]&&tx<x[i])))
{
// printf("go %d\n",i);
ts^=1<<i;
}
// printf("Bea %d %d\n",x[i],y[i]);
}
// print(ts); printf("\n");
if (dis[tx][ty][ts]>dis[nx][ny][ns]+1)
{
dis[tx][ty][ts]=dis[nx][ny][ns]+1;
qx.push(tx);qy.push(ty);qs.push(ts);
}
}
}
}
}
printf("%d\n",ret);
}
BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何的更多相关文章
- 【BZOJ】1294: [SCOI2009]围豆豆Bean
题解 随机跳题真好玩 这个就是考虑我们怎么判断点在多边形内,就是点做一条射线,穿过了奇数条边 我们只需要记录一个二进制状态表示每个点的射线穿过路径的次数的奇偶性 枚举起点,然后用BFS的方式更新dp状 ...
- [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa
1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 458 Solved: 305[Submit][Sta ...
- 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
[BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...
- BZOJ1294: [SCOI2009]围豆豆Bean
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294 状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路. 然后判断一 ...
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
[BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)
题面 传送门 题解 首先要解决一个问题,就是怎么判断一个点是否在多边形内部 从这个点向某一个方向做一条射线,如果这条射线和多边形的交点为奇数说明在多边形内,否则在多边形外 然而有一些特殊情况,比方说一 ...
- bzoj1294 [SCOI2009]围豆豆
Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...
- 【题解】SCOI2009围豆豆
很久之前就很想做的一道题,一直思考到今天才下定决心看题解.这道题中,很关键的一点就在于:如何判断一个点是否在一个多边形内?其实如果计算几何基本功扎实的话,应该是可以很快给出答案的(可惜我完全不行):由 ...
随机推荐
- JS 一个页面关闭多个页面
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- 【MYSQL】mysql-5.6.19-win32免安装版本配置方法
[MYSQL]mysql-5.6.19-win32免安装版本配置方法 1.文件下载网站(http://dev.mysql.com/downloads/): 具体下载地址:http://211.136. ...
- COGS 2082. Asm.Def谈笑风生
★ 输入文件:asm_talk.in 输出文件:asm_talk.out 简单对比时间限制:2 s 内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣 ...
- 51nod 1174 区间中最大的数(送盾题)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- adhoc无法下载应用程序 此时无法安装-解决
解决方法 点击xcode,进入build setting,选择code signing,provisioning profile选择automatic 或者选择adhoc的provisioning p ...
- Words Prefixed Trans-
transit v. Pass across or through (an area) The new large ships will be too big to transit the Panam ...
- Codeforces Round #272 (Div. 2)-C. Dreamoon and Sums
http://codeforces.com/contest/476/problem/C C. Dreamoon and Sums time limit per test 1.5 seconds mem ...
- 国庆集训 || Wannafly Day4
链接:https://www.nowcoder.com/acm/contest/205#question 一场题面非常 有趣 但是题目非常 不友好的比赛 QAQ L.数论之神 思维(?) 题意:求 ...
- C#在透明窗体WinForm上面画图(电子尺小工具的实现)
前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...
- Luogu P3727 曼哈顿计划E 点分治+hash
题目: P3727曼哈顿计划E 分析: 大长题面容易给人一种不可做的错觉,但是这题考的知识点都是我们熟悉的. 稍加分析我们可以得到,我们可以把每个点当成一个单独的游戏,如果k=1,就是简单的nim游戏 ...