Назовенм последовательность волнистой если для всех кроме первого элемента выполняется: для всех элементов кроме первого и последнего, что либо этот член последовательности больше всех своих соседей, либо меньше.
Например : 12121212121-волнистая
а 123321 - нет
дана последовательность и надо из неё выделить самую большую волнистую подпоследовательность .
Последовательность храниться в массиве помогите хоть алгоритмом.
Идем слева направо по последовательности, и помним, сколько (максимум) последних прочитанных символов удовлетворяют условию "волнистости". А именно:
1. Один символ всегда волнистый.
2. Два символа, только если они не равны, волнистые.
3. n+1 символов - волнистые, если первые n из них - волнистые, и для n-го символа выполняется условие "больше всех своих соседей, либо меньше"
Получается алгоритм:
1. Прочитать следующий символ. Считать его первым в искомой подстроке (ПИП)
2. Прочитать следующий символ. Если он равен ПИП, считать его ПИПом и перейти к шагу 2
3. Иначе считать его вторым в искомой подстроке (ВИП). Найден ответ длины 2.
4. Прочитать следующий символ. Если он равен предыдущему прочитанному, считать его ПИПом и перейти к шагу 2
5. Проверить для предыдущего символа (стоящего перед только что прочитанным) условие волнистости. Если оно выполняется, перейти к шагу 4.
6. Иначе запомнить найденный ответ (не включая последний прочитанный символ). Последних два прочитанных символа считать ПИПом и ВИПом соответственно, и перейти к шагу 4.
При этом "запомнить найденный ответ" означает не вырезать саму подстроку (подмассив), а просто запомнить индексы первого (ПИП) и последнего элементов в подпоследовательности.
Алгоритм получается линейный.
нет, вы неправильно мепня поняяли. Подпоследовательностью последовательности (Xn) я имею ввиду любой упорядоченный набор элементов последовательности (yn) где если Yi , yj ( элементы последовательности) и I>j то номер элемента Yi в последовательности Xn будет больше номера Yj в последовательности Xn
Например:
Xn : 1 2 3 4 5 6 7 8 9 0
Yn : 1 3 5 7 9
xprogrammer, а теперь перечитай свой первый пост... Там хоть что-то ВООБЩЕ про вторую последовательность было? Чего ты сразу полностью условие не написал?
Значит, так... По 5 (как минимум) примеров ДА волнистых и НЕ волнистых последовательностей приведи, только больше условия меняться не будут. Как приведешь - так и получишь ответ.
Волнистые: 1 2 1 2 1 2 1 3 2 6 1 8 4
77
12 13
1 0 5 4
2 6 0 7 6
Не волнистые: 2 2
1 1 2 1 3 1
1 2 3 2 3
2 1 0 1 2 3
2 3 2 3 22 3
примеры : вход : 1 1 2 1 1
выход: 1 2 1
вход : 1 2 3 2 1
выход: 1 3 1
вход: 1 3 2 5 4
выход: 1 3 2 5 4
вход: 1 2 1 5 9
выход: 1 2 1 5
если не понятно, то вы скажите что и я поясню
Ты помоему не прав биекцию ты непосроишь в последовательностях:
1-2-1-2-1-2-1-2-1-2-1-2-1-2-1-2-1
и
1-2-1-2-1-2-1-2-1-2-2-2-1-2-1-2-1
тогда я не понимаю почему это алгоритм будет работать ... но посмотрим что автор сделает ...
не понела как он будет работать на 1-2-1-2-1-2-1
поясните кто - ни буть пока наш ночной программер не пришел
Если честно, не могу врубиться в решение Рыбака - видимо, сказывается то, что уже полпятого ночи (или утра )..
Но вот так, на вскидку, не понимаю также, в чем собсно, проблема с алгоритмом.
Что если сделать так..
Назовем элемент, соседи которого оба меньше или оба больше его, пиком.
Тогда волнистой следует называть последовательность, каждый член которой - пик.
Два или больше соседних равных между собой элементов назовем плато.
Элементы последовательности между двумя соседними пиками или плато назовем склоном.
Не могу (или не хочу) сейчас строго доказывать, но наибольшая волнистая подпоследовательность получится, если :
1. пройтись по исходной последовательности и в каждом плато выкинуть все точки, кроме одной (любой);
2. после этого выкинуть все склоны, оставив только пики.
Замечу еще, что искомых подпоследовательностей может быть несколько. Даже приведенный мной алгоритм неоднозначен (в п.1), но неоднозначностей на самом деле больше. Например, для полседовательности
1 3 4 2
ответов может быть два:
1 3 2
или
1 4 2 .
Мой алгоритм из многих возможных выбирает подпоследовательность с максимальной амплитудой волн. Самую штормовую .
Если я не прав - скажите, где
Простите, забыл представиться: lapp, к вашим услугам
program Problem;ВОт реализация, алгоритма Lapp
{$APPTYPE CONSOLE}
uses
SysUtils;
var n : integer;
var posl : array [0..100000] of integer;
count, last,sum1,sum2 : integer;
a,b : array [1..100000] of char;
znak : char;
procedure read_data;
var i: integer;
begin
assign(input, 'wave.in');
assign(output, 'wave.out');
reset(input);
rewrite(output);
readln(n);
for i := 1 to n do read(posl[i]);
close(input);
end;
function min(a,b:integer):integer;
begin
if a>b then result:=b else result:=a;
end;
var i: integer;
begin
read_data;
count:=0;
case n of
1 : write(0);
2 : if posl[1]=posl[2] then write(1) else write(0);
else begin
for i:= 2 to n do begin
if posl[i]>posl[i-1] then a[i-1]:='+';
if posl[i]=posl[i-1] then a[i-1]:='0';
if posl[i]<posl[i-1] then a[i-1]:='-';
end;
if a[1]='0' then inc(count);
for i:= 2 to n-1 do
if (a[i]=a[i-1])or(a[i]='0') then inc(count);
write(count);
end;
end;
close(output);
end.
Reflex, я праввильно понял, что ты выдаешь только длину максимальной подподпод..под.. блин, уже язык заплетается.. подпоследовательности!
Вопрос, мне кажется, стоял в нахождении ее самой..
И, извини, уже падаю на кровать... хватит на сего... хр..хррррр...
Что - то вы тут разшлись, может я что не так понял конечно, вот таккой вариант пойдет ?
uses crt;
const
n = 6;
type
TArray = array [1..n] of Byte;
const
A : TArray = (
1, 2, 1, 2, 1,3
);
function Compare(a, b: Byte): Integer;
begin
if a > b then
Compare := 1
else if a = b then
Compare := 0
else Compare := -1;
end;
function IsOk: Boolean;
var
i, x, y: Integer;
begin
i := 0;
repeat
inc(i);
if (i <= n - 2) then begin
x := Compare(A[i], A[i + 1]);
y := Compare(A[i + 1], A[i + 2]);
end;
until ((i > n - 2) or (x * y = 0) or (y = x));
isOk := (i > n - 2);
end;
begin
clrscr;
if IsOk then writeln('Sequence -- OK')
else writeln('Sequence -- BAD');
readln;
end.
Именно, я упустил видимо это ?