найти самую длиную пилооброзную последовательность
От: Nick_2003 Украина  
Дата: 05.07.03 20:49
Оценка:
Привет всем.
Помогите получить алгоритм следующей задачи.
Последовательность назвается пилообразной, если a1<a2>a3<a4>...>ak или a1>a2<a3>a4<...<ak.
В массиве А(m) найти самую длиную пилооброзную последовательность.

Буду благодарен.
Николай.
Re: найти самую длиную пилооброзную последовательность
От: Рома Мик Россия http://romamik.com
Дата: 05.07.03 21:13
Оценка:
Здравствуйте, Nick_2003, Вы писали:

N_>Последовательность назвается пилообразной, если a1<a2>a3<a4>...>ak или a1>a2<a3>a4<...<ak.

N_>В массиве А(m) найти самую длиную пилооброзную последовательность.

А в чем тут проблема?
Я думаю так ( это не тестировалось ) :
int start = 0, end = 0;
for(int n = 1; n < count - 1; ++n)
{
    int n1 = n;
    while(((a[n - 1] > a[n]) == (a[n] < a[n + 1]) 
        || (a[n - 1] < a[n]) == (a[n] > a[n + 1]))
        && n < count - 1) 
        ++n;
    if(n - n1 > start - end) 
    {
        start = n1 - 1;
        end = n;
    }
    while(((a[n - 1] >= a[n]) == (a[n] >= a[n + 1]) 
        && n < count - 1) 
        ++n;
}
// здесь start и end индексы первого и последнего элемента максимальной пилообразной подпоследовательности
... << RSDN@Home 1.1 alpha 1 >>
Re[2]: найти самую длиную пилооброзную последовательность
От: Рома Мик Россия http://romamik.com
Дата: 06.07.03 10:51
Оценка:
Здравствуйте, Рома Мик, Вы писали:

Чего-то я ошибся зачем-то

РМ>
РМ>int start = 0, end = 0;
РМ>for(int n = 1; n < count - 1; ++n)
РМ>{
РМ>    int n1 = n;
РМ>    while(((a[n - 1] > a[n]) == (a[n] < a[n + 1]) 
РМ>        || (a[n - 1] < a[n]) == (a[n] > a[n + 1]))
РМ>        && n < count - 1) 
РМ>        ++n;
РМ>    if(n - n1 > start - end) 
РМ>    {
РМ>        start = n1 - 1;
РМ>        end = n;
РМ>    }
РМ>    while((a[n - 1] > a[n]) != (a[n] < a[n + 1]) 
РМ>        && (a[n - 1] < a[n]) != (a[n] > a[n + 1])
РМ>        && n < count - 1) 
РМ>        ++n;
РМ>}
РМ>// здесь start и end индексы первого и последнего элемента максимальной пилообразной подпоследовательности
РМ>
... << RSDN@Home 1.1 alpha 1 >>
Re: найти самую длиную пилооброзную последовательность
От: Аноним  
Дата: 07.07.03 08:52
Оценка: 28 (1)
Здравствуйте, Nick_2003, Вы писали:

N_>Привет всем.

N_>Помогите получить алгоритм следующей задачи.
N_>Последовательность назвается пилообразной, если a1<a2>a3<a4>...>ak или a1>a2<a3>a4<...<ak.
N_>В массиве А(m) найти самую длиную пилооброзную последовательность.

N_>Буду благодарен.

N_>Николай.

Представь, что числа в массиве это значения кусочно линейной функции в точках 1 ... n. Как только ты нарисуешь примерный график решение будет очевидным. Тебе нужны локальные максимумы и минимумы этой функции, которые будут чередоваться давая, то что ты называешь пилообразной последовательностью. Естественно, максимальных последовательностей может быть несколько, но указанная 100% максимальная. Если бы это было не так, то по принципу Дирихле в один из полуинтервалов [M_i,M_{i+1}) (M_i — локальный максимум или минимум функции) попало бы две точки из массива, а функция на таком интервале монотонна => этого быть не может.
Как найти локальные максимумы и минимумы, я думаю, понятно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.