【发布时间】:2015-12-11 00:12:00
【问题描述】:
问题:
我有一张以 10 像素(一维数组)形式给出的照片(黑白) 字符“b”和“w”,b 表示黑色,w 表示白色)。
I 也有N个过滤器。每个过滤器都是一个一维数组(大小为 10),包括 '+' 和 ' - ' 。您可以选择这 N 个过滤器的任何子集并应用 他们在照片上。
应用过滤器:如果 ith 过滤器的字符是 '+' 反转 ith 像素 照片没有任何反应。
我们需要输出的数量 我们可以选择不同的过滤器子集将照片转换成 全黑。
约束:
1 15
我的方法:
基本思想是我有一个函数 NumberPossible(i, 起始位置),其中 i 是尚未使用的过滤器的索引。
i 从 0 到 n 不等。
基本情况:NumberPossible(n, 当且仅当 startingPosition 为 all 时,startingPosition) 等于 1 黑色。否则为 0。
重复:NumberPossible(i, 起始位置) = NumberPossible(i+1, applyFilter(i, startPosition)) + NumberPossible(i+1, startingPosition) 那 表示您如何应用过滤器或不应用 过滤器。
问题:
以下方法超时(可能是由于昂贵步骤 代码中提到)。有没有更好的算法,我在哪里 不需要存储所有状态并且需要更少的空间 复杂性?
【问题讨论】:
-
每隔一段时间就会以某种形式提出同样的问题。他们弄错了其他事情,但通常认识到您一次只需要两行
dp,当前和以前,因此您可以使用dp[i&1][y]和dp[(i+1)&1][y]所以时间复杂度是相同的(但由于缓存而更快)并且空间被削减到非常微不足道。您还需要按所需数据的顺序进行计算,而不是递归。 -
但是,由于只有 1024 个可能的过滤器并且原始序列无关紧要,因此您可以通过计算每个可用的数量并按批次使用它们而不是单独使用它们来做得更好。跨度>
-
@JSF 如果我更改
dp[i][y] to dp[i&1][y]和dp[(i+1)][y] to dp[(i+1)&1][y],它会给出错误的输出。 -
计算的递归序列不允许您使用主要的空间优化。您需要切换到前向计算序列,计算另一个维度上的所有值(而不是按需),因为很难预测您将需要哪个。按需节省的成本似乎太重要了,不能放弃。但是,检测之前是否进行过计算的成本实际上加起来超过了按需提供的总收益。
-
@JSF 我完全不明白你在说什么:/ 一点伪代码可能会有所帮助。
标签: c++ algorithm dynamic-programming memoization