【状态压缩DP】SCOI2009 围豆豆
题目大意
洛谷链接
在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值Vi。游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到起始格。最终游戏者的得分为所有被路径围住的豆豆的分值总和减去游戏者移动的步数。矩阵中某些格子内设有障碍物,任何时刻游戏者不能进入包含障碍物或豆子的格子。游戏者可能的最低得分为0,即什么都不做。
(例子可以打开链接查看,比较重要)
输入格式
第一行两个整数N和M,为矩阵的边长。
第二行一个整数D,为豆子的总个数。
第三行包含D个整数V1到VD,分别为每颗豆子的分值。
接着N行有一个N×M的字符矩阵来描述游戏矩阵状态,0表示空格,#表示障碍物。而数字1到9分别表示对应编号的豆子。
输出格式
仅包含一个整数,为最高可能获得的分值。
样例输入
3 8
3
30 -100 30
00000000
010203#0
00000000
样例输出
38
数据范围
50%的数据满足1≤D≤3。
100%的数据满足1≤D≤9,1≤N, M≤10,−10000≤Vi≤10000。
思路
基本方法
现学现卖
判断一个点是否在一个多边形内部的方法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。
正解
首先看到D很小,在10范围内,所以肯定是用状压DP了。
直接暴力枚举起点。状态不仅要记录当前的位置,还要记录经过每一个豆豆右射线的奇偶性。
经过每一个豆子右射线的奇偶性是一个D位01串,可将其视为D位的二进制数以方便记录(可用bitset,当然我这个蒟蒻没用orz)。
则f[i][j][k]表示坐标(i,j),并且经过第t个豆豆右射线的奇偶性为 k>>t&1。
然后可以写一个状压DP+SPFA解决问题,枚举起点和状态。
记得预处理坐标。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步