蒜头君救人

问题:
蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境,假设蒜头君所在的村子是 n×mn×m 的网格,网格中.号代表平地,#号代表该地已被洪水淹没,A、B……等大写字母表示该地有村民被困,s代表蒜头君的起点,t代表蒜头君的终点。

蒜头君的初始速度为 k 秒一格,他每次可以向上下左右 4 个方向中的一个移动 1 格。在背上一个村民后,他的速度可能会降低,也可能会加快,但他的速度不能快于 1 秒每格,那么蒜头君想知道,他最快需要多长时间将所有村民救出?

注意:不能在终点以外的地方放下村民;可以同时背多个村民。

第一行 3 个正整数 n,m(1≤n,m≤10),kn,m(1≤n,m≤10),k,分别表示村庄长度、宽度、蒜头君初始速度。

接下来 nn行,每行一个长度为mm的字符串,表示村庄的地形,字符串意义如上所述。

接下来若干行,每行一个大写字母、一个整数,表示该编号的村民会使 kk增加 / 减少多少。行数等同于地形中大写字母的个数。大写字母按字典序,即A、B、C的顺序排列,保证前后两行的字母是连续的,村民个数小于等于 10。

输出格式


解:
首先我们可以看出 数据范围狠小所以是状压DP 对于关键的点只有十几个 所以我们会想到 删点 利用(floyd)求最短距离
定义(f[x][y][p])表示在 背x集合 终点为y集合 当前在p号关键点的最短时间
那么我们有两种情况

  1. 在p号点找到一个cunmin
    f[x][y][p]=min(f[x^(1<<p][y][s]+w[s][p]);
    2.在终点放下若干村民
    f[x][y][en]=min(f[x^(1<<s][y|(1<<s]][k]+w[k][en]);
刀剑映出了战士的心。而我的心,漆黑且残破
原文地址:https://www.cnblogs.com/OIEREDSION/p/11620477.html