Clojure 如何过滤递增向量中的递减元素?

Clojure 如何过滤递增向量中的递减元素?,clojure,filtering,series,Clojure,Filtering,Series,比如说 [1 2 3 40 7 30 31 32 41] 过滤后应 [1 2 3 30 31 32 41] 这个问题看起来不是很简单,因为我想最大化结果向量的大小,所以如果开始向量是 [1 2 3 40 30 31 32 41 29] 我更喜欢这个结果 [1 2 3 30 31 32 41] 不仅仅是 [1 2 3 29] 您的问题称为问题 通过: (defn位置[桩卡] (让[[les gts](>>桩(与#(>les last first分开)) modpile(cons newe

比如说

[1 2 3 40 7 30 31 32 41]
过滤后应

[1 2 3 30 31 32 41]
这个问题看起来不是很简单,因为我想最大化结果向量的大小,所以如果开始向量是

[1 2 3 40 30 31 32 41 29]
我更喜欢这个结果

[1 2 3 30 31 32 41]
不仅仅是

[1 2 3 29]

您的问题称为问题

通过:

(defn位置[桩卡]
(让[[les gts](>>桩(与#(>les last first分开))
modpile(cons newelem(第一gts))]
(混凝土桩(剩余gts()()))
(定义a-最长[卡片]
(让[桩(减少位置“()卡片)]
(>>桩最后一个倒转)
(a-最长[12343031324129])
;; => (1 2 3 30 31 32 41)

如果您关心性能,可能会优化使用
瞬变。

最简单的解决方案:生成所有必须跳过的位置的所有置换,然后检查它是否保持所需的属性,然后选择最长的。在这种情况下,置换的数量显然是
2^N
,而整个过程中只有512个
[1 2 3 40 30 31 32 41 29]< /代码>一个蛮力的方法在这里是行不通的,因为我的系列是由几百个元素组成的。我可以考虑启发法。然后,乍一看,可以使用动态编程的方法。我不理解第一个输出示例。如果你只删除<代码> 40 <代码>,你就有一个比你大的严格递增的向量。范例。@Andre你说得对,很抱歉输入错误。非常感谢!这正是我要找的
(defn place [piles card]
  (let [[les gts] (->> piles (split-with #(<= (ffirst %) card)))
        newelem (cons card (->> les last first))
        modpile (cons newelem (first gts))]
    (concat les (cons modpile (rest gts)))))

(defn a-longest [cards]
  (let [piles (reduce place '() cards)]
    (->> piles last first reverse)))

(a-longest [1 2 3 40 30 31 32 41 29])
;; => (1 2 3 30 31 32 41)