CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
题意:
在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹。你从(sx,sy)出发,走四连通的格子。你需要走一条闭合的路径,可以自交,且围出来的复杂多边形内不能包含任何炸弹。
你围出来的复杂多边形中包含的宝箱的价值和减去步数就是你的收益。
求最大收益。$n,m \le 20,a + b \le 8$
太坑了课件上的题意有问题一开始没说步数...
后来改上然后$inq[][][]$最后没从$2$改成$S$然后我就看着玄学的$inq$好长时间
和上题一样,只不过从一个点变成多个点,状压一下就好了、
更新答案的时候枚举状态计算是否有炸弹和价值和
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=,S=<<,M=N*N*S+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,g[N][N],sx,sy,val[N];
struct Object{
int x,y,id;
Object(int a=,int b=,int c=):x(a),y(b),id(c){}
bool operator <(const Object &r)const{return id<r.id;}
}a[N];
int p,t;
int dx[]={,-,, },
dy[]={, ,,-};
char s[N];
int d[N][N][S];
struct Grid{
int x,y,s;
Grid(int a=,int b=,int c=):x(a),y(b),s(c){}
}q[M];
int head,tail,inq[N][N][S];
inline void lop(int &x){if(x==M) x=;}
inline bool isInter(int a,int b,int x1,int y1,int x2,int y2){//1-->2 isInter (a,b)--right-->
if(x1<a&&x2==a&&y2>b) return ;
if(x2<a&&x1==a&&y1>b) return ;
return ;
}
int HandleInter(Grid u,Grid t){
int s=u.s;
for(int i=;i<;i++)
s^= isInter(a[i].x , a[i].y , u.x , u.y , t.x , t.y)<<i;
return s;
}
void spfa(){
d[sx][sy][]=;
head=tail=;
q[tail++]=Grid(sx,sy,);inq[sx][sy][]=;
while(head!=tail){
Grid u=q[head++];lop(head);
int x=u.x,y=u.y,s=u.s;//printf("\nnow %d %d %d\n",x,y,p);
inq[x][y][s]=;
for(int i=;i<;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<||nx>m||ny<||ny>n||g[nx][ny]) continue; Grid t(nx,ny);
int ns=t.s=HandleInter(u,t);//printf("lok %d %d %d\n",nx,ny,np);
if(d[nx][ny][ns]>d[x][y][s]+){//srintf("new %d %d %d\n",nx,ny,ns);
d[nx][ny][ns]=d[x][y][s]+;
if(!inq[nx][ny][ns])
q[tail++]=t,lop(tail),inq[nx][ny][ns]=;
}
}
}
int ans=;
for(int i=;i<S;i++) if(d[sx][sy][i]<INF){
int _=,bomb=;
for(int j=;j<;j++) if(i&(<<j)){
if(a[j].id==) {bomb=;continue;}
else _+=val[j];
}
if(bomb) continue;
ans=max(ans,_-d[sx][sy][i]);
}
printf("%d",ans);
}
int main(){
//freopen("in","r",stdin);
m=read();n=read();
memset(d,,sizeof(d));
for(int i=;i<=m;i++){
scanf("%s",s+);
for(int j=;j<=n;j++){
g[i][j]=(s[j]!='.');
if(s[j]=='S') g[i][j]=,sx=i,sy=j;
else if(s[j]=='B') a[p++]=Object(i,j,);
else if(s[j]>=''&&s[j]<='') a[p++]=Object(i,j,s[j]-''-),t++;
}
}
sort(a,a+p);
for(int i=;i<t;i++) val[i]=read();
spfa();
}
CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]的更多相关文章
- Codeforces 375C - Circling Round Treasures(状压 dp+最短路转移)
题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在 ...
- Codeforces 375C Circling Round Treasures - 最短路 - 射线法 - 位运算
You have a map as a rectangle table. Each cell of the table is either an obstacle, or a treasure wit ...
- Circling Round Treasures CodeForces - 375C
C. Circling Round Treasures time limit per test 1 second memory limit per test 256 megabytes input s ...
- HDU3247 Resource Archiver (AC自动机+spfa+状压DP)
Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
- poj2411 Mondriaan's Dream (轮廓线dp、状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17203 Accepted: 991 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- 【BZOJ-1097】旅游景点atr SPFA + 状压DP
1097: [POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 1531 Solved: 352[Submit][Sta ...
随机推荐
- 高可用高性能分布式文件系统FastDFS实践Java程序
在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...
- Unity 小笔记
1,Time.deltatime放在Update和fixedupdate中得到的值是不一样的.还以为是通过两个值来获取. 2,VR中绘制射线可以使用LineRender. 3,Unity中判断一个东西 ...
- Kafka集群的搭建
Kafka集群的搭建 node1 node2 node3 kafka须用版本(kafka-0.8.2.2),否则不兼容spark1.6 1.启动zookeeper集群node1 node2 ...
- python的枚举
通过Enum()方式 这种方式value属性则是自动赋给成员的int常量,默认从1开始计数 from enum import Enum Month = Enum('Month', ('Jan', 'F ...
- 如何解决wamp中apache外部IP访问问题
# # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /mis ...
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address
http://blog.csdn.net/ownfire/article/details/7966645 今天在做LNMP的时候,启动nginx服务,无法开启,导致网页打不开.把服务从起一下发现提示错 ...
- ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中
1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...
- cobol
过程部的语句一般从B区开始书写. ACCEPT A,B (x) DISPLAY T1,T2.(O)显示在一行上 DISPLAY T1 DISPLAY T2 (O)显示在两行上 read ...
- MyBatis 查询示例
环境搭建 数据库schema 1)datasource.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...
- linux workqueue的名字长度小问题
在排查一个nvme的的workqueue的问题的时候,发现nvme的queue的进程名被截断了, [root@localhost caq]# ps -ef |grep -i nvme root : ? ...