QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 256 MB Total points: 100

#13183. 雅加达的公园

Statistics

雅加达有三个公园,分别称为公园 1、公园 2 和公园 3。雅加达的新任总督想要通过添加砖块来装饰这些公园。这些砖块将堆叠在三个公园中。雅加达共有 $N$ 块砖,编号从 1 到 $N$。编号为 $i$ 的砖块比编号为 $i+1$ 的砖块小。我们不希望把较大的砖块放在较小的砖块上面。因此,仅当 $i < j$ 时,我们才能将编号为 $i$ 的砖块放在编号为 $j$ 的砖块上面。

我们将砖块在三个公园中的分布定义为一种砖块配置。注意,每个公园中必须只有一个砖块堆,且砖块必须按照上一段所述的顺序堆叠。例如,如果 $N=3$,一种可能的砖块配置是:砖块 1(在顶部)和砖块 2(在底部)位于公园 1,公园 2 中没有砖块,砖块 3 位于公园 3。

我们可以通过执行以下操作将一种砖块配置更改为另一种: 选择两个不同的公园 $i$ 和 $j$。取出公园 $i$ 堆栈中最顶部的砖块,并将其放在公园 $j$ 堆栈的顶部。如果公园 $i$ 中没有砖块,则此操作无效。如果此操作导致公园 $j$ 的堆栈违反了堆叠顺序条件,则此操作也无效。 由于我们需要租用卡车将砖块从公园 $i$ 运输到公园 $j$,我们需要为该操作支付 $R_{i,j}$ 单位的费用。注意,将砖块从公园 $i$ 运输到公园 $j$ 的费用可能与从公园 $j$ 运输到公园 $i$ 的费用不同。

最初,砖块处于某种砖块配置中,我们称之为初始砖块配置。雅加达的新任总督想要尝试 $M$ 种砖块配置。因此,我们必须从初始砖块配置开始执行若干操作,使得新任总督想要的每种砖块配置(以任意顺序)至少出现一次。最后,新任总督还希望我们将所有砖块都放在(任意)一个公园中。我们希望最小化满足其需求的总成本。

形式化地说,令 $G_1, G_2, \dots, G_M$ 为新任总督想要的砖块配置。我们想要构建一个砖块配置序列 $C_0, C_1, \dots, C_k$ ($k \ge 0$),使得总成本最小,其中: $C_0$ 是初始砖块配置。 存在一个整数序列 $x_1, x_2, \dots, x_M$ ($0 \le x_i \le k$),使得 $\{C_{x_1}, \dots, C_{x_M}\} = \{G_1, \dots, G_M\}$。注意,该序列不一定是递增的。 $C_k$ 是一种所有砖块都堆叠在(任意)一个公园中的砖块配置。 对于所有 $0 \le i < k$,我们可以通过执行一次操作(如上所述)从 $C_i$ 达到 $C_{i+1}$。 * 该序列的成本是所有 $0 \le i < k$ 更改 $C_i$ 到 $C_{i+1}$ 所需费用的总和。

让我们帮助雅加达的新任总督!

输入格式

第一行包含两个整数:$N$ ($1 \le N \le 40$) 和 $M$ ($0 \le M \le 16$),分别表示砖块的数量和配置的数量。接下来的三行,每行包含三个整数。第 $i$ 行的第 $j$ 个整数是 $R_{i,j}$ ($0 \le R_{i,j} \le 1000$; $R_{i,i} = 0$),表示将砖块从第 $i$ 个公园移动到第 $j$ 个公园的费用。接下来的三行表示初始砖块配置,格式如下文所述。接下来的 $M$ 个块描述了新任总督想要的配置,每个块包含三行,格式与下文所述相同。

每种配置由三行表示。第 $i$ 行以一个整数 $K$ ($0 \le K \le N$) 开头,表示公园 $i$ 中的砖块数量,后跟 $K$ 个整数:$A_1, A_2, \dots, A_K$ ($1 \le A_i \le N$),表示公园 $i$ 中的砖块编号。保证对于所有 $1 \le i < j \le K$,都有 $A_i < A_j$。还保证 1 到 $N$ 之间的每个整数在三行数组 $A$ 的并集中恰好出现一次。

输出格式

输出一行,包含满足新任总督需求所需的最小总成本(以货币单位计)。

样例

样例输入 1

3 0 
0 1 1000 
1 0 1 
1000 1 0 
2 1 2 
0 
1 3

样例输出 1

5

样例输入 2

3 2 
0 2 2
2 0 2
2 2 0 
2 1 2 
1 3 
0 
3 1 2 3 
0 
0 
0 
0 
3 1 2 3

样例输出 2

22

说明

样例 1 说明

在第一个样例中,我们最初在公园 1 有砖块 1 和砖块 2,在公园 3 有砖块 3。由于 $M=0$,我们的目标只是达到一种所有砖块都在同一个(任意)公园的砖块配置。因此,我们可以执行以下操作: 将砖块 3 从公园 3 移到公园 2。费用为 1。 将砖块 1 从公园 1 移到公园 2。费用为 1。 将砖块 1 从公园 2 移到公园 3。费用为 1。 将砖块 2 从公园 1 移到公园 2。费用为 1。 * 将砖块 1 从公园 3 移到公园 2。费用为 1。

因此,所有砖块现在都在公园 2,我们花费了 5 个单位的费用。没有比 5 个单位费用更低的方案。注意,我们不一定需要最小化操作次数。

样例 2 说明

在第二个样例中,如果我们先满足第二个配置,再满足第一个配置,就可以达到最优解。从初始配置出发,我们可以用 4 次操作达到第二个配置,总成本为 8。从第二个配置出发,我们可以用 7 次操作达到第一个配置,总成本为 14。由于第一个配置已经将所有砖块堆叠在一个公园中,我们不需要任何额外的操作。因此,总成本为 22。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.