- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里查看这个 topcoder 问题:
http://community.topcoder.com/tc?module=ProblemDetail&rd=4725&pm=2288
在java部分下有这样的代码:
public class KiloManX {
boolean ddd = false;
int[] s2ia(String s) {
int[] r = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
r[i] = s.charAt(i) - '0' ;
}
return r;
}
public int leastShots(String[] damageChart, int[] bossHealth) {
int i, j, k;
int n = damageChart.length;
int[][] dc = new int[n][];
int[] cost = new int[1 << n];
for (i = 0; i < n; i++) {
dc[i] = s2ia(damageChart[i]) ;
}
for (i = 1; i < 1 << n; i++) {
cost[i] = 65536 * 30000;
for (j = 0; j < n; j++) {
int pre = i - (1 << j);
if ((i & (1 << j)) != 0) {
cost[i] = Math.min(cost[i], cost[pre] + bossHealth[j]) ;
for (k = 0; k < n; k++) {
if ((i & (1 << k)) != 0 && k != j && dc[k][j] > 0) {
cost[i] = Math.min(cost[i],
cost[pre] + (bossHealth[j] + dc[k][j] - 1) / dc[k][j]);
}
}
}
}
}
return cost[(1 << n) - 1] ;
}
static void pp(Object o) {
System.out.println(o);
}
}
我试图了解他做了什么。所以我的理解是:
i
- 以某种方式跟踪访问的节点(这是代码中最令人困惑的部分)
j
- 是我们想要击败的怪物
k
- 是我们用来击败 j 的前一个怪物的武器dc
是字符串到矩阵的输入数组cost
,保持每一步的成本,某种动态规划?我不明白怎么办cost[1 << n]
能给出结果吗?据我所知,他们正在尝试所有可能的组合/组合。我感到困惑的是(即使在执行并主演了一个多星期之后):
pre
- 是前一个怪物被击败的成本(即我们在那里产生了多少成本),但我不明白你是如何从 (i - 1 << j)
中得到它的.我已经执行了程序(调试器),盯着它看了一个多星期,并尝试解码它,但我对代码的位操作部分感到困惑。有人可以解释一下吗?
最佳答案
cost
, keep cost at each step, some sort of dynamic programming?
是的,它们是部分成本,但是将它们描述为“每步”成本会忽略此数组中索引的最重要意义。更多内容见下文。
I don't understand how
cost[1 << n]
can give the result?
当然,这本身并不会产生任何结果。它只是声明一个包含 2n 个元素的数组。
how do they keep track of all the combinations?
见下文。这与cost
的原因密切相关。数组被声明为它的大小。
I understand
pre
- is the cost of the previous monster defeated (i.e. how much cost we incurred there), but I don't understand how you get it from just(i - 1 << j)
.
当然pre
本身并不是成本。但是,它有条件地用作 cost
的索引。大批。现在考虑条件:
if ((i & (1 << j)) != 0) {
表达式i & (1 << j)
测试是否位 j
i
的值已设置。当它是时,i - (1 << j)
(即 pre
)评估关闭位 j
的结果i
的值。这应该会告诉您 cost
的索引是位掩码。该数组的大小 ( 1 << n
) 是另一个线索:它是不同的 n
的数量。 -bit 位掩码。
这里的技巧是一个相对常见的技巧,也是一个值得了解的技巧。假设您有一组 N 个对象,并且您希望以某种方式表示其所有子集(== 其元素的所有不同组合)。每个子集的特征在于 N 个对象中的每一个是否是元素。您可以将其表示为 N 个数字,每个数字可以是 0 或 1——即 N 位。现在假设您将这些位串在一起形成 N 位数字。从 0(含)到 2N(不含)的每个整数都有其最低有效 N 位的不同模式,因此每个整数对应于不同的子集。
所提供的代码正是使用这种对应关系将 Boss 集合的不同子集编码为 cost
中的不同索引。数组——它回答了你的另一个问题,即它如何跟踪组合。给定一个这样的索引 i
表示包含 boss j
的子集,索引i - (1 << j)
表示去掉boss后得到的集合j
.
粗略地说,程序通过检查从少一个元素的子集形成非空子集的所有方法来优化每个非空子集的成本。 (1 << n) - 1
是对应于整个集合的索引,所以最后就是 cost
的那个元素包含整体优化值。
关于java - 使用刚刚访问过的 int 变量通过矩阵查看不同的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50991275/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!