输入格式
第一行输入包含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个硬币,这是最佳方式。
答案 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