题目:Circling Round Treasures:CodeForces - 375C

题意:

给你一个N*M的地图(N,M<=20),地图上’#'表示障碍物,'B’表示炸弹,数字表示宝藏(炸弹个数+宝藏个数<=8),每个宝藏有价值(-200<=v<=200),'S’表示出发点。每次移动可以从一个格子移动到相邻格子。寻找一条路径从’S’出发再回到’S’的路径,移动步数记为K,这个路径所包围的宝藏价值总和记为V,则这条路径的价值为V-K。题目即是求可行的最大的路径价值,并且不能包围炸弹。

思路:

这里一定要注意到宝藏和炸弹个数和小于等于8个。这样就可以用状压+BFS了。用F[X][Y][S]记录最优状态,S是282^828的状压,表示8个宝藏(或炸弹)目前是否被包含在路径中。F[X][Y][S]表示位于(X,Y)位置时,8个宝藏(或炸弹)包含状态为S时的路径最大价值。
一个宝藏(或炸弹)是否被包含,只要向右做一个射线,如果碰到奇数个路径点那就是包含,否则偶数为不包含。所以经过一个点时,同行左侧的宝藏(或炸弹)包含情况会被反转,重点都说完了,后面自己思考吧。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int nex[4]={1,-1,0,0},ney[4]={0,0,-1,1},q_size=410*(1<<8);
int n,m,sx,sy,ans,cnt,va[10],vx[10],vy[10],qx[q_size],qy[q_size],ql[q_size],qs[q_size],b[23][23][1<<8];
char mp[23][23];
inline int get_si(int x,int y){int ans=0;for (int i=1;i<=cnt;++i) if (vx[i]==x&&vy[i]>y) ans|=1<<i-1;return ans;
}
int main(){scanf("%d%d",&n,&m);for (int i=1;i<=n;++i) scanf("%s",mp[i]+1);for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) if (mp[i][j]>='0'&&mp[i][j]<='9') ++cnt,vx[mp[i][j]-48]=i,vy[mp[i][j]-48]=j;for (int i=1;i<=cnt;++i) scanf("%d",&va[i]);for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) if (mp[i][j]=='B') va[++cnt]=-1e8,vx[cnt]=i,vy[cnt]=j;else if (mp[i][j]=='S') mp[i][j]='.',sx=i,sy=j;int h=0,t=1;qx[1]=sx;qy[1]=sy;while (++h<=t){if (qx[h]==sx&&qy[h]==sy){int sum=0;for (int i=1;i<=cnt;++i) if ((1<<i-1)&qs[h]) sum+=va[i];ans=max(ans,sum-ql[h]);}for (int i=0;i<4;++i){int xx=qx[h]+nex[i],yy=qy[h]+ney[i],no_s=xx!=qx[h]?qs[h]^get_si(min(xx,qx[h]),yy):qs[h];if (mp[xx][yy]=='.'&&!b[xx][yy][no_s]) b[xx][yy][no_s]=1,qx[++t]=xx,qy[t]=yy,ql[t]=ql[h]+1,qs[t]=no_s;}}printf("%d",ans);     return 0;
}

状压搜索 Circling Round Treasures:CodeForces - 375C相关推荐

  1. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]

    C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交 ...

  2. CF 221 C Circling Round Treasures - dp - 状压

    题目大意: 给你一张网个图,每个位置是空地.障碍.炸弹.宝藏.起点之一. 规划一条从其点出发不包含炸弹的闭合路线(回路),并可获得最大的利润. 利润定义为路线内部的宝藏收益(可能为负数)之和减去路径长 ...

  3. 【CF375C】Circling Round Treasures

    Portal --> CF375C Solution 一个有趣的事情:题目中有很大的篇幅在介绍如何判断一个位置在不在所围的多边形中 那么..给了方法当然就是要用啊 ​ 首先是不能包含\('B'\ ...

  4. Circling Round Treasures(codeforces 375c)

    题意:要求在一张网格图上走出一条闭合路径,不得将炸弹包围进去,使围出的总价值减去路径长度最大. /*类似于poj3182的做法,只不过出现了多个点,那么就用状态压缩的方法记录一个集合即可. */ #i ...

  5. 【CF375C】Circling Round Treasures【XSY1176】大包子环绕宝藏【状压dp】

    注意到题目中有这一句话: 注意路线可以自交.为了确定一个格子是否在这条路线里面,请使用以下算法判断: 1.假设该点的坐标为需要判断的点为 p(i,j) ,该点不在路线上 2.从该点往任意方向作一条射线 ...

  6. CF 375C Circling Round Treasures(状态压缩+bfs)

    题意:给出一个n×m的矩形区域,每个位置是空地.炸弹.财宝.障碍中的一个,现在要求走一个封闭区域,使得围起来的区域中不能有炸弹,只有空地可以走,最后的得分为被围起来的财宝的价值总和减所走的步数,问能得 ...

  7. CF221C Circling Round Treasures

    题目大意 给定一个$n\times m$的网格$(n,m\leq 20)$,每个格子都是$S\space \#\space B\space x\space .$中第一个. $S$表示起点,保证有且仅有 ...

  8. CF375C Circling Round Treasures(BFS+DP)

    题目 题目传送门\color{red}{题目传送门}题目传送门 输入输出样例 输入样例一 4 4 .... .S1. .... .... 10 输出样例一 2 输入样例二 7 7 ....... .1 ...

  9. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

最新文章

  1. 用深度神经网络搭建马赛克神器,高清无码效果感人
  2. php 精度计算问题
  3. python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解
  4. Win7(包括32和64位)使用GitHub
  5. iOS开发,多个button数组,每个数组只能选中5项,多个数组只能选择3个。
  6. oracle出现12505错误的解决步骤
  7. 三、Nginx内置变量
  8. 音乐在线播放Demo
  9. 完美替代Windows任务计划程序 —— 定时执行专家
  10. linux快速扫ip段端口,小巧快速的IP地址和端口扫描工具Angry IP Scanner
  11. BUAA_2020级(信息大类)数据结构综合作业编程题_文本摘要生成_哈希表
  12. 几何语言点C是ab的中点,备战中考:初中数学作图基本步骤及作图语言
  13. python七段数码管绘制实验报告_python—绘制七段数码管
  14. 梅科尔工作室深度学习第五课-CNN
  15. ArcGIS中的坐标系
  16. 【过关斩将】如何在工作中提高沟通能力?
  17. 8大模块、40个思维模型,打破思维桎梏,满足你工作不同阶段、场景的思维需求,赶紧收藏慢慢学
  18. 服务器虚拟化专用ovf模板,Vmware虚拟机备份、OVF模板
  19. C#强烈粉碎文件代码
  20. 传智播客黑马Java学习笔记_day05

热门文章

  1. android metal api,Metal 简述及其API
  2. Java降落伞_gta5降落伞怎么打开PS4
  3. 国美金融是“持牌大户”还是“违规大户”:国美易卡贷超出现套路贷APP,暴力催收恐吓借款人
  4. 关于“分节符(下一页)”和“分节符(奇数页)”的问题
  5. B. Alyona and a Narrow Fridge
  6. python泡泡_Python实现Windows上气泡提醒效果的方法
  7. 太厉害了!用Python做一个大风车, 继续吱呦呦地转!
  8. 你好 Redis,能回答我 7 个问题吗?
  9. 按年复利和连续复利的区别及计算
  10. python导入siri_python实现一个简洁siri功能