题面

传送门

题解

首先要解决一个问题,就是怎么判断一个点是否在多边形内部

从这个点向某一个方向做一条射线,如果这条射线和多边形的交点为奇数说明在多边形内,否则在多边形外

然而有一些特殊情况,比方说一个多边形\((0,0),(2,0),(2,1),(1,1),(1,2)\),如果一个点\((1,1)\)向上做射线和这个多边形有两个交点,然而这个点还是在多边形内部的

那么我们可以通过加一些\(eps\)之类的来避免这种情况,具体可以看代码

把所有的豆子状压,枚举起点\((x,y)\),设\(f_{i,j,s}\)表示到了\((i,j)\),围住的豆子的情况为\(s\)的情况下的最小步数,那么最后\(f_{x,y,s}\)就是走了一个回路之后围住豆子情况为\(s\)的最小步数

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=15,M=(1<<9)+5;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int f[N][N][M],vis[N][N][M],sum[M],val[N],xi[N],yi[N];
struct node{int x,y,s;node(R int xx,R int yy,R int ss):x(xx),y(yy),s(ss){}};
queue<node>q;char mp[N][N];
int n,m,d,res=-2e9,lim;
inline int get(R int x,R int y,R int xx,R int yy,R int s){fp(i,0,d-1)if((x==xi[i]&&xx>xi[i]||x>xi[i]&&xx<=xi[i])&&yy>yi[i])s^=(1<<i);return s;
}
void solve(int x,int y){q.push(node(x,y,0));fp(i,1,n)fp(j,1,m)fp(s,0,lim-1)f[i][j][s]=inf;
//  memset(f,0x3f,sizeof(f));f[x][y][0]=0,vis[x][y][0]=1;while(!q.empty()){int x=q.front().x,y=q.front().y,s=q.front().s;q.pop();vis[x][y][s]=0;
//      printf("%d %d %d\n",x,y,s);
//      if((x<1||x>n)&&(y<1||y>m)&&(s<0||s>=lim))puts("qwq");fp(k,0,3){int nx=x+dx[k],ny=y+dy[k];if(mp[nx][ny]!='0')continue;int ns=k<2?get(x,y,nx,ny,s):s;if(cmin(f[nx][ny][ns],f[x][y][s]+1)&&!vis[nx][ny][ns])q.push(node(nx,ny,ns)),vis[nx][ny][ns]=1;}}fp(i,0,lim-1)cmax(res,sum[i]-f[x][y][i]);
}
int main(){
//  freopen("testdata.in","r",stdin);scanf("%d%d%d",&n,&m,&d),lim=(1<<d);fp(i,0,d-1)scanf("%d",&val[i]);fp(i,0,lim-1)fp(j,0,d-1)if(i>>j&1)sum[i]+=val[j];fp(i,1,n)scanf("%s",mp[i]+1);fp(i,0,n+1)mp[i][0]=mp[i][m+1]='#';fp(j,0,m+1)mp[0][j]=mp[n+1][j]='#';fp(i,1,n)fp(j,1,m)if(mp[i][j]>='1'&&mp[i][j]<='9')xi[mp[i][j]-'1']=i,yi[mp[i][j]-'1']=j;fp(i,1,n)fp(j,1,m)if(mp[i][j]=='0')solve(i,j);printf("%d\n",res);return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10513068.html

洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)相关推荐

  1. 洛谷P1896 互不侵犯【状压DP】

    题目链接:P1896 互不侵犯 分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案: #include<bits/stdc++.h> using namespace ...

  2. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P&quo ...

  3. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算

    题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...

  4. 2018.11.01【NOIP2016】【洛谷P2831】愤怒的小鸟(状压DP)

    传送门 解析: 数据范围181818,多么显然的状压... 但是!!!为什么O(n22n)O(n^22^n)O(n22n)能过???复杂度明显不对啊... 这里提供一种O(n2n)O(n2^n)O(n ...

  5. 【洛谷】P1052 过河(状压dp)

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  6. 【洛谷】P1357 花园(状压+矩阵快速幂)

    题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和 ...

  7. BZOJ1026 || 洛谷P2657 [SCOI2009]windy数【数位DP】

    Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. ...

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

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

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

最新文章

  1. [shell]简单的shell提示和参数脚本
  2. shell编程之数学运算
  3. 51单片机学习笔记(郭天祥版)(9)——IIC、EEPROM
  4. go语言调用python_Golang中调用Python3
  5. 使用LiveClick升级您的实时书签
  6. SpringCloud stream连接RabbitMQ收发信息
  7. CentOS硬盘挂载之fdisk命令进行查看/分区/格式化/挂载
  8. 微信回应朋友圈广告无法一键关闭:将持续优化产品体验
  9. Unity接入百度语音识别WebAPI
  10. 6.go import
  11. linux su - 用户名,在Linux中,su命令 (切换用户)
  12. linux下gmt4绘制站点分布图,GMT复杂图制作教程———让作图简单的飞起来
  13. 东芝Toshiba DP-3003 一体机驱动
  14. 数据库中,DDL,DQL,DML,DCL是什么意思?
  15. 这场大雨还没把我浇醒吗?
  16. 突然就看懂了《大话西游》
  17. hashmap用stream流操作_基础篇:JAVA.Stream函数,优雅的数据流操作
  18. Eclips配置Maven
  19. 算法:一个小人通过有鳄鱼的河
  20. 多模型的ROC曲线绘制

热门文章

  1. uva-10602-贪心
  2. Linux查看Bios信息
  3. 从编译安装Keepalived 到 配置 负载均衡(LVS-DR)
  4. Centos升级Python 2.7并安装pip、ipython
  5. SQL Server-表表达式基础回顾(二十四)
  6. android 开发 命名规范
  7. 《Objective-c》-(第一个OC程序)
  8. win7+eclipse用maven构建hadoop项目注意事项
  9. 使用连接来代替in和not in(使用外连接技巧)
  10. 我的选车经历--学习比经验更重要