我需要仅使用一个递归函数找到最长单调递增子序列的长度。
例如,给定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);
}
答案 0 :(得分: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;
}
这基本上做的是在每个点比较是否包括当前数字或跳过它更好。也会很慢 - 例如你可以添加memoization来改进,但我猜这不是作业的一部分?
答案 1 :(得分:0)
我在这里给出了你提出的单个递归函数的完整代码。不幸的是它在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);
}
}
}
}