Может ли кто-нибудь помочь мне понять основную логику решения проблемы, упомянутой в http://www.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493
Последовательность zig zag представляет собой последовательность, которая попеременно увеличивается и уменьшается. Итак, 1 3 2 - зигзаг, но 1 2 3 нет. Любая последовательность одного или двух элементов - зигзаг. Нам нужно найти самую длинную подпоследовательность zig zag в данной последовательности. Подпоследовательность означает, что нет необходимости, чтобы элементы были смежными, как в самой продолжительной возрастающей проблеме подпоследовательности. Таким образом, 1 3 5 4 2 может иметь 1 5 4 в качестве подпоследовательности зигзага. Нам интересен самый длинный.
Я понимаю, что это проблема динамического программирования, и она очень похожа на Как определить самую длинную растущую подпоследовательность с помощью динамического программирования?.
Я думаю, что любому решению понадобится внешний цикл, который будет итерации по последовательностям разной длины, а внутренний цикл должен будет проходить по всем последовательностям.
Мы будем хранить самую длинную zig-zag-последовательность, заканчивающуюся индексом я в другом массиве, скажем, dpStore в индексе i. Таким образом, промежуточные результаты сохраняются и могут впоследствии использоваться повторно. Эта часть является общей для всех задач динамического программирования. Позже мы найдем глобальный максимум и вернем его.
Мое решение, безусловно, неверно, вставляя здесь, чтобы показать, что я до сих пор. Я хочу знать, где я ошибся.
private int isZigzag(int[] arr)
{
int max=0;
int maxLength=-100;
int[] dpStore = new int[arr.length];
dpStore[0]=1;
if(arr.length==1)
{
return 1;
}
else if(arr.length==2)
{
return 2;
}
else
{
for(int i=3; i<arr.length;i++)
{
maxLength=-100;
for(int j=1;j<i && j+1<=arr.length; j++)
{
if(( arr[j]>arr[j-1] && arr[j]>arr[j+1])
||(arr[j]<arr[j-1] && arr[j]<arr[j+1]))
{
maxLength = Math.max(dpStore[j]+1, maxLength);
}
}
dpStore[i]=maxLength;
}
}
max=-1000;
for(int i=0;i<arr.length;i++)
{
max=Math.max(dpStore[i],max);
}
return max;
}