You have a map as a rectangle table. Each cell of the table is either an obstacle, or a treasure with a certain price, or a bomb, or an empty cell. Your initial position is also given to you. You can go from one cell of the map to a side-adjacent one…
题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在凸多边形内部所走过的最少步数. 考虑转移,枚举与 \((x,y)\) 相邻的点 \((x',y')\).但是 \(S\) 的变化可能有些棘手.这里有一个结论,对于某一点 \((x,y)\),任意引出一条射线,如果它与多边形有奇数个交点,那么 \((x,y)\) 就在多边形内部.由于这里引出的射线可以…
C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交,且围出来的复杂多边形内不能包含任何炸弹.你围出来的复杂多边形中包含的宝箱的价值和减去步数就是你的收益.求最大收益.$n,m \le 20,a + b \le 8$ 太坑了课件上的题意有问题一开始没说步数... 后来改上然后$inq[][][]$最后没从$2$改成$S$然后我就看着玄学的$inq$好…
C. Circling Round Treasures time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You have a map as a rectangle table. Each cell of the table is either an obstacle, or a treasure with a certain p…
题意:要求在一张网格图上走出一条闭合路径,不得将炸弹包围进去,使围出的总价值减去路径长度最大. /* 类似于poj3182的做法,只不过出现了多个点,那么就用状态压缩的方法记录一个集合即可. */ #include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; ][],ch[]; ],gy[],val[],w[],dp[][][],cnt=-…
Portal --> CF375C Solution 一个有趣的事情:题目中有很大的篇幅在介绍如何判断一个位置在不在所围的多边形中 那么..给了方法当然就是要用啊 ​ 首先是不能包含\('B'\),处理方式很简单直接把他当成一个值为\(-inf\)的宝藏即可,这样所有的object就全部可以看成一类了,不需要再额外考虑 注意到object的总数很少,考虑状压,记\(vis[x][y][st]\)表示当前在\((x,y)\)这个点,射线与路径的交点数量为奇数的object的状态为\(st\),这种…
题目大意 给定一个$n\times m$的网格$(n,m\leq 20)$,每个格子都是$S\space \#\space B\space x\space .$中第一个. $S$表示起点,保证有且仅有一个. $\#$表示障碍,不能通过,$.$表示空地,可以通过 $B$表示炸弹,$x$是一个数字,每个数子代表着一个宝藏,每个宝藏有对应的价值(可以为负). 炸弹和宝藏的数量不超过$8$个 现在你要规划一条从$S$出发,每次只能沿着上下左右四个方向,只能经过除了空地和起点的可以自交的闭合回路,使得这条…
Magic Forest 题意:就是在1 ~ n中找三个值,满足三角形的要求,同时三个数的异或运算还要为0: , where  denotes the bitwise xor of integers x and y. 我已开始没想到a^b^c=0相当于c = a^b; 这样的转化就可以是三次的变成二次的: #include <cstdio> #include <algorithm> #include <iostream> using namespace std; ];…
[Uva658] It's not a Bug, it's a Feature! 题目略 UVA658 Problem PDF上有 试题分析:     本题可以看到:有<=20个潜在的BUG,那么如果每一个补丁都DFS一下的话肯定炸掉,那么怎么办呢?     我们发现,要在一个最短的时间求出来,而且状态之间可以变换多次,那么DP呢?     DP的话,由于BUG指令可以用0代替,所以我们无从转移,也就是说有后效性(后面的决策可能影响前面的)     那么还有什么此类转移的算法呢?貌似只剩下图论了…
题意:给一个数 n,让你求一个排列,使得这个排列与0-n的对应数的异或之最大. 析:既然是异或就得考虑异或的用法,然后想怎么才是最大呢,如果两个数二进制数正好互补,不就最大了么,比如,一个数是100,那么我们只要找11,(都是二进制) 这不就正好么,一试,果然是这样.就是这样找,而且两两正好配对,如果多了一个就是0呗,也就是0.那知道一个数,怎么找那另一个和它互补的呢?其实很简单, 就是用111-100=11,就是利用这个,就能很轻松把这个题解决,注意可能超int,要用long long. 代码…