• 【状态压缩DP】SCOI2009 围豆豆


    题目大意

    洛谷链接
    在一个(N×M)的矩阵方格内分布着(D)颗豆子,每颗豆有不同的分值(V_i)。游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到起始格。最终游戏者的得分为所有被路径围住的豆豆的分值总和减去游戏者移动的步数。矩阵中某些格子内设有障碍物,任何时刻游戏者不能进入包含障碍物或豆子的格子。游戏者可能的最低得分为0,即什么都不做。
    (例子可以打开链接查看,比较重要)

    输入格式

    第一行两个整数(N)(M),为矩阵的边长。
    第二行一个整数(D),为豆子的总个数。
    第三行包含(D)个整数(V_1)(V_D),分别为每颗豆子的分值。
    接着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≤V_i≤10000)

    思路

    基本方法

    现学现卖
    判断一个点是否在一个多边形内部的方法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

    正解

    首先看到(D)很小,在10范围内,所以肯定是用状压DP了。
    直接暴力枚举起点。状态不仅要记录当前的位置,还要记录经过每一个豆豆右射线的奇偶性。
    经过每一个豆子右射线的奇偶性是一个(D)位01串,可将其视为(D)位的二进制数以方便记录(可用bitset,当然我这个蒟蒻没用orz)。
    (f[i][j][k])表示坐标((i,j)),并且经过第t个豆豆右射线的奇偶性为 (k>>t&1)
    然后可以写一个状压DP+SPFA解决问题,枚举起点和状态。
    记得预处理坐标。

  • 相关阅读:
    C++ 复制控制之复制构造函数
    static关键字总结
    C++ 隐式类类型转换
    Unity 移动端触摸屏操作
    【原创】为什么要用规则引擎?
    【原创】你的Redis怎么持久化的
    【原创】JAVA中令人眼花撩乱的数字魔法
    【原创】谈谈redis的热key问题如何解决
    【原创】Mysql中事务ACID实现原理
    【原创】杂谈自增主键用完了怎么办
  • 原文地址:https://www.cnblogs.com/Midoria7/p/12702928.html
Copyright © 2020-2023  润新知