【问题标题】:Find the length of the longest increasing subsequence using only one auxiliary recursion function仅使用一个辅助递归函数查找最长递增子序列的长度
【发布时间】:2012-07-25 03:24:21
【问题描述】:

我需要只使用一个递归函数来找到最长的单调递增子序列的长度。 例如,给定一个arr={45 1 21 3 33 6 53 9 18},它需要返回 5。我已经开始编写代码但我卡住了,我不知道如何找出哪个调用给出了最大长度。

函数longestSet是我的辅助函数,我可以使用我想要的任何变量,但必须从函数max_set调用。

void question3(int question)
{
    int *arr, size;
    printf("enter the array size\n");
    scanf("%d", &size);
    arr=(int*)malloc(size*sizeof(int));
    fillArr(arr, size-1);
    max_set(arr, size);
    free(arr);
}

void max_set(int arr[], int size)
{
    int i=0, finelmax=0, count=0,longrising;
    longrising=longestSet(arr,size,i,finelmax,count);
    printf("the length of the longest risind set is: %d", longrising);
}

int longestSet(int arr[], int size, int i, int finelmax, int count)
{
    if(i==size)
        return count;

    if(arr[i]>=finelmax)
    {
        finelmax=arr[i];
        return longestSet(arr,size,i+1,finelmax,count+1);
    }

    return longestSet(arr,size,i+1,finelmax,count);
}

【问题讨论】:

  • 欢迎来到 SO。术语“集合”非常具有误导性,因为集合根据定义是无序的并且不能上升。 “序列”更合适,我会编辑它。另外,这是作业吗?习惯上用homework标签标记作业。
  • 我在这里看不到任何 C++ 代码,所以我将其标记为 C 问题。如果两种语言都适合您,请在 C 标记旁边再次添加 C++ 标记。
  • 不,不要同时添加 C 和 C++ 标签。它们是非常不同的语言,它们意味着非常不同的答案。选择一个并坚持下去。
  • 这个问题可以简化为在二进制字符串中找到最长的'1'序列。也许这可能会有所帮助? - 或者可能不 - 该示例与我理解的问题描述不匹配。

标签: c recursion


【解决方案1】:

类似这样的:

int longestSet(int arr[], int size, int i, int finelmax, int count)
{
    if(i==size) return count;

    int length1 = longestSet(arr, size, i + 1, finelmax, count);
    if(arr[i] > finelmax)
    {
        int length2 = longestSet(arr, size, i + 1, arr[i], count + 1);
        if(length2 > length1) length1 = length2;
    }

    return length1;
}

这基本上是在每个点比较是否包含当前数字或跳过它会更好。也会很慢 - 例如,您可以添加记忆来改进它,但我猜这不是作业的一部分?

【讨论】:

  • 先谢谢!这不是作业的过去,但我想了解你的意思是什么?限制数组的大小?
  • 查看en.wikipedia.org/wiki/Memoization - 基本上这意味着将函数的结果保存在某处,然后在使用相同参数调用函数时使用该结果而不是再次计算。
【解决方案2】:

我在这里给出了您所要求的带有单个递归函数的完整代码。不幸的是,它在 java 中,但您的目的将得到解决,因为用于递归的函数几乎相同。

import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class longestSubSequence{
    public static void main (String [] args)throws IOException{
    new longestSubSequence().run();
    }

    int max = -1;
    int index = 1;
    int [] array;
    private void run() throws IOException{
    array = new int [50];
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Input your array
    StringTokenizer st = new StringTokenizer (br.readLine());
    array[0] = -1;
    while (st.hasMoreTokens()){
            array[index++] = Integer.parseInt(st.nextToken());
    }
    index--;
    dfs (0, 0);
    System.out.println(max);//      Prints the maximum length
    }

    private void dfs (int curr, int length){
        if (length > max )max = length;
        if (curr >= index)
            return ;
        for (int I=curr+1;I <= index; I++){
            if (array[I] >= array[curr]){
                dfs (I, length+1);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2018-02-19
    • 1970-01-01
    • 2021-12-04
    • 2014-03-14
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多