距离算法 - 清除所有级别所需的最小硬币

时间:2018-04-29 19:11:26

标签: algorithm combinations puzzle hamming-distance

托尔正在玩一款有N级和M种可用武器的游戏。级别编号从0到N-1,武器编号从0到M-1。他可以按任何顺序清除这些级别。在每个级别中,需要这些M武器的某些子集来清除此级别。如果在特定级别,他需要购买x新武器,他将支付x ^ 2个硬币。还要注意他可以把他目前拥有的所有武器都提升到一个新的水平。最初,他没有武器。你能找到所需的最低硬币,以便他能清除所有级别吗?

输入格式

第一行输入包含2个空格分隔的整数:

N =游戏中的等级数

M =武器类型的数量

N行跟随。这些行的第i个包含一个长度为M的二进制字符串。如果该字符串的第j个字符为1,则表示我们需要一个类型为j的武器来清除第i个级别。

约束

1 <= N <= 20

1 <= M <= 20

输出格式

打印一个整数,这是问题的答案。

示例TestCase 1

输入

1 4 
0101

输出

4

说明

这场比赛只有一个级别。我们需要两种类型的武器--1和3.因为最初,Thor没有武器,他将不得不购买这些武器,这将花费他2 ^ 2 = 4个硬币。

示例TestCase 2

输入

3 3 
111
001
010

输出

3

说明

这个游戏有3个关卡。 0级(111)需要所有3种类型的武器。第1级(001)只需要2型武器。第2级只需要1型武器。如果按给定顺序清除等级(0-1-2),则总成本= 3 ^ 2 + 0 ^ 2 + 0 ^ 2 = 9个硬币。如果我们按照1-2-0的顺序清除水平,那将是成本= 1 ^ 2 + 1 ^ 2 + 1 ^ 2 = 3个硬币,这是最佳方式。

1 个答案:

答案 0 :(得分:0)

Gassa's answer之美的部分原因在于,or其中一个等级可以达到不同的状态。具有当前状态的位串掩码,我们保证实现当前状态不包括访问该级别(因为否则这些位将被设置)。这意味着通过添加不同的位掩码来检查从一个状态到另一个状态的转换,保证我们正在查看尚未包含该掩码的排序。因此,像Gassa这样的公式可以起作用:让f(st)表示实现状态st的成本,然后:

f(st) = min(
  some known cost of f(st),
  f(prev_st) + (popcount(prev_st | level) - popcount(prev_st))^2
)
for all level and prev_st that or to st