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 ...
随机推荐
- Effective Java 第三版——23. 优先使用类层次而不是标签类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- C语言单向链表
1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...
- ECharts插件的使用
ECharts插件:官网下载echarts.js开发者可以选择源码.下载地址:http://echarts.baidu.com/download.html 下载之后,echarts.js放在js文件夹 ...
- nginx.conf文件
user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; pid /us ...
- 在Intellij idea 2017中运行tomcat 8.5
前提:jdk,tomcat都已安装完,环境变量该配置的都配置了,tomcat localhost:xx 能登上去 首先新建web小项目 new project next 为项目命个名 finis ...
- 《并行程序设计导论》——MPI(Microsoft MPI)(1):Hello
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- QT5 Thread线程
QT5 Thread线程继承QThread方式 一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密 QTimer *t = new QTimer(*parent); //创建Q ...
- Maven打包时去掉项目版本号
Maven打包后,jar或war文件名里带有版本号信息,如projectname0.0.1-SNAPSHOT.jar等,怎么去掉呢? 解决办法: 打开项目pom.xml文件,在<build> ...
- Java中实例方法、类方法和构造方法
类方法,有static修饰符,典型的主函数public static void main(String[] args){}实例方法,就是一般的方法构造方法,没有返回值(就是连void都没有),方法名与 ...
- 修改Weblogic jdk版本
找到 F:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin setDomainEnv.cmd