clojure实现最长上升子序队列算法

4Clojure上的一道题:4Clojure 最长上升子序列算法
描述如下:

Given a vector of integers, find the longest consecutive sub-sequence of increasing numbers. If two sub-sequences have the same length, use the one that occurs first. An increasing sub-sequence must have a length of 2 or greater to qualify.

例:
[1 0 1 2 3 0 4 5]的最长上升子序列为 [0 1 2 3]
[5 6 1 3 2 7]的最长上升子序列为 [5 6]

(defn test [coll]
;使用map存放每个起始元素的上升队列,key无意义,仅用于标记不同的队列
(loop [flag 0
     tmp-result {flag [(first coll)]}
     index 0]
  (if (< index (- (count coll) 1))
    (let [current (nth coll index)
          next (nth coll (inc index))]
    (if (> next current)
      ;如果下一个元素大于当前元素,把下一个元素加入到当前元素的队列中,flag就是key,保持不变
     (recur flag (assoc tmp-result flag (conj (tmp-result flag) next)) (inc index))
      ;否则说明新的队列开始了,新建一个队列,key为flag+1,value为下一个元素
     (recur (inc flag) (assoc tmp-result (inc flag) [next]) (inc index))))
  ;得到结果之后筛选最长的队列
  (let [tmp (vals tmp-result)]
    (loop [final (first tmp)
           s (next tmp)]
      (if (first s)
        (if (>= (count (first s)) (count final))
          (recur (first s) (next s))
          (recur final (next s)))
        ;队列长度至少为2
        (if (> (count final) 1)
          final
          [])))))))

最终结果:

user=> (test [5 6 1 3 2 7])
[5 6]
user=> (test [1 0 -1 3 0])
[-1 3]
user=> (test [1 0 1 2 3 0 4 5])
[0 1 2 3]
时间: 2024-10-14 05:25:01

clojure实现最长上升子序队列算法的相关文章

动态规划--之--最长公共子字符串

package 动态规划;import java.util.Scanner;public class LogestCommonZiXuLie { public static void main(String[] args)     {      Scanner scan = new Scanner(System.in);      while(scan.hasNextLine())        {          String str = scan.nextLine();         

hdu1003 最大连续子序和

Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The first line of the input contains an inte

uva 10066 The Twin Towers (最长公共子)

uva 10066 The Twin Towers 标题效果:最长公共子. 解题思路:最长公共子. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int a[105], b[105], dp[105][105]; int main() { int n, m, Case = 1; while (scanf(&quo

2000:最长公共子上升序列

2000:最长公共子上升序列 查看 提交 统计 提问 总时间限制:  10000ms 内存限制:  65536kB 描述 给定两个整数序列,写一个程序求它们的最长上升公共子序列.当以下条件满足的时候,我们将长度为N的序列S1 , S2 , . . . , SN 称为长度为M的序列A1 , A2 , . . . , AM的上升子序列: 存在 1 <= i1 < i2 < . . . < iN <= M ,使得对所有 1 <= j <=N,均有Sj = Aij,且对于

使用后缀数组寻找最长公共子字符串JavaScript版

后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标准,只是借鉴了其中的思想. 小菜实现的算法,有两个版本,第一个是空间换时间,第二个是时间换空间. 空间换时间版本 1 /* 2 利用后缀数组获取两个字符串最长公共子字符串 3 空间换时间版本 4 @params 5 s1 String,要分析的字符串 6 s2 String,要分析的字符串 7 no

HDU 1003 Max Sum (最大连续子序和)

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 156637    Accepted Submission(s): 36628 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

最长公共子上升序列(LCIS)

最长公共子上升序列 AC_Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <string> 6 #include <cmath> 7 #include <cstdlib> 8 #include <algorithm> 9 using namespace std;

最长递增子序列 O(NlogN)算法

https://www.felix021.com/blog/read.php?entryid=1587&page=3&part=1 感谢作者! 标题:最长递增子序列 O(NlogN)算法 出处:Blog of Felix021 时间:Wed, 13 May 2009 04:15:10 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1587  内容: 今天回顾WOJ1398,发现了这个当时没有理解透彻的算法. 看了好久

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一