2014-11-05 7 views
0

Я написал код на C, который, учитывая последовательность, должен найти длину самой длинной увеличивающейся подпоследовательности. Однако он всегда возвращает длину 4, если это неверно.Найти длину самой длинной растущей подпоследовательности

Вот мой код до сих пор:

int LIS(int* seq, int* temp_seq, int seq_size) 
{int i, j; 

for(i=0; i<seq_size; i++); 
{ 
    temp_seq[i]=0; 
} 
    for(i=1; i<seq_size; i++); 
    { 
    for(j=1; j<seq_size; j++) 
    { 
     if (seq[i]<temp_seq[j]) 
     seq[i]=temp_seq[j]; 

     else if (seq[i]>temp_seq[j]) 
     seq[i]=temp_seq[j+1]; 
    } 
    } 
return(sizeof temp_seq); 
} 

Что я делаю неправильно?

Также следует отметить, что последовательность отображает все целые числа от 1 до n без повторных чисел.

+0

Посмотрите здесь: http://stackoverflow.com/q/8658187/3933332 – Rizier123

+2

Некоторые аспекты неясны. Ввод пробной информации и ожидаемый результат. – chux

+0

такая линия: seq [i] = temp_seq [j]; наступает на исходную последовательность, возможно НЕ то, что вы хотели сделать. Единственное место, где temp_seq [] когда-либо задано, находится в начальной настройке его для всех 0 – user3629249

ответ

0

tmp_seq объявлен в функции defintion как указатель на тип int. Поэтому ваша функция всегда возвращает размер int * (в данном случае это 4 байта).

+0

А я думаю, что понимаю, но я не уверен, что с этим делать, есть ли у вас какие-нибудь советы? Мне придется многое изменить или я закрываю? –

+0

Как и что? Что касается вашего первого предложения, часть моей спецификации для этой программы состоит в том, чтобы иметь «int * ...», поэтому я не могу это изменить. –

+0

есть несколько вещей, которые вы можете попробовать. Первый заключается в использовании 'int tmp_seq []' вместо 'int * tmp_seq'. Во-вторых, вы можете попытаться сохранить счетчик, который вы увеличиваете, когда обнаруживаете, что элемент является частью возрастающей подпоследовательности. Вам нужно будет сохранить еще один счетчик для «максимального размера», который вы можете использовать, чтобы определить, больше ли текущая подпоследовательность или меньше последней. – eurythmia

1
  1. Возврат неправильного значения. return(sizeof temp_seq); является константой, размером указателя temp_seq. @eurythmia

  2. ; после for(i=0; i<seq_size; i++);, конечно, не нужно, так как это завершает цикл. То же самое для for(i=1; i<seq_size; i++);.

  3. Значение seq[0] никогда не проверялось и не сохранялось в temp_seq.

  4. Возможный доступ прошел конец массива с seq[i]=temp_seq[j+1];

  5. кодекса появляется хотеть, чтобы очистить temp_seq[], а затем установить все seq[] с temp_seq[].

Смежные вопросы