Эта проблема касается последовательностей натуральных чисел a1, a2,…, aN.Подпоследовательность последовательности - это все, что получается путем отбрасывания некоторых элементов.Например, 3,7,11,3 - это подпоследовательность 6, 3 , 11,5, 7 , 4,3, 11 , 5, 3 , но 3,3,7 не является подпоследовательностью 6,3,11,5,7,4,3,11,5,3.
Полностью разделяющая последовательностьпоследовательность a1, a2,…, aN, где ai делит aj всякий раз, когда i
Учитывая последовательность целых чисел, ваша цель состоит в том, чтобы найти длину самой длинной полностью делительной подпоследовательности этой последовательности.
Рассмотримпоследовательность 2,3,7,8,14,39,145,76,320
Она имеет полностью делительную последовательность длины 3, а именно 2,8 320, но ни одной длины 4 или больше.
Рассмотримпоследовательность 2,11,16,12,36,60,71,17,29,144,288,129,432,993.
Имеет две полностью разделяемые подпоследовательности длины 5 - (2,12,36,144,288) или (2,12,36,144,432).
Чтобы решить эту проблему, я написал следующий код:
import java.util.Scanner;
class DivSeq {
private int n, input[];
void accept() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
input = new int[n];
for(int i = 0; i<n; i++)
input[i] = sc.nextInt();
sc.close();
}
int size(int a[]) {
//this function returns the number of non zero entries in an array
int ctr = 0;
for(int i = 0; i<a.length; i++) {
if(a[i]==0)
break;
else
ctr++;
}
return ctr;
}
int sequence() {
int subseq[], pvrseq[], seq[], j, a = 1, q, k = 1, f = 0;
subseq = new int [n];
pvrseq = new int [n];
seq = new int [n];
for(int i = 0; i<n-1; i++) {
k = 1;
for(int c = 0; c<seq.length; c++)
seq[c] = 0;
//seq has been initialized, now inserting 1st value
seq[0] = input[i];
//creating the sequence
for(j = i+1; j<n; j++) {
if(input[j]%input[i]==0)
seq[k++] = input[j];
}
//if size of sequence is 1, then there is no use of checking it
if(size(seq)<2)
continue;
subseq[0] = seq[0];
a = 1;
while(a<size(seq)-1) {
k = 2;
for(int p = a; p<size(seq)-1; p++) {
//initial value of subsequence
if(subseq[1] == 0)
subseq[1] = seq[p];
//creating the subsequence
for(q = p+1; q<size(seq); q++) {
if(seq[q]%seq[p]==0) {
subseq[k++] = seq[q];
p = q-1;
f = 1;
break;
}
}
if(f==1 && q==size(seq)-1)
break;
}
//checking the size of subsequence and previous sequence
if(size(pvrseq)<size(subseq)) {
for(int y = 0; y<subseq.length; y++)
pvrseq[y] = subseq[y];
for(int y = 1; y<subseq.length; y++)
subseq[y] = 0;
}
a++;
}
}
return size(pvrseq);
}
public static void main(String [] args) {
DivSeq obj = new DivSeq();
obj.accept();
System.out.println(obj.sequence());
}
}
Этот код решает некоторые тестовые случаи, которые он должен решать.
вариант 1: 2,3,7,8,14,39,145,76,320 желаемый результат = 3
вариант 2: 2,11,16,12,36,60,71,17, 29,144,288,129,432,993 желаемый результат = 5
Остальные тестовые примеры невидимы.
Однако это не решает все из них, и я не могу понять, почему.Ему удается удовлетворить только 4/11 тестовых случаев (включая случай 1 и случай 2).