Занятие 4. Справочник

Занятие 4. Справочник

Длина наибольшей возрастающей (наидлиннейшей) подпоследовательности за O(N2)
int[] d = new int [MAXN]; //MAXN - наибольшее возможное значение n
for (int i=0; i < n; ++i)
{
        d[i] = 1; 
        for (int j=0; j < i; ++j)
                if (a[j] < a[i])
                        d[i] = Math.max (d[i], 1 + d[j]);
}
int ans = d[0];
for (int i=0; i < n; ++i)
        ans = Math.max (ans, d[i]);

Вывод ответа – наибольшей (наидлиннейшей) возрастающей подпоследовательности

int[] d = new int[MAXN]; // MAXN - наибольшее возможное значение n
int[] p = new int[MAXN]; // массив предков
for (int i = 0; i < n; ++i)
{
	d[i] = 1;
	//сначала предок отсутствует
	p[i] = -1;
	for (int j = 0; j < i; ++j)
		if (a[j] < a[i] && d[i] < d[j] + 1)
		{
			d[i] = d[j] + 1;
			//устанавливаем предка для i-го элемента
			p[i] = j;
		}
}
//индекс ПОСЛЕДНЕГО элемента НВП
int ians = 0;

for (int i = 1; i < n; ++i)
	if (d[ians] < d[i]) ians = i;

//Формируем путь
int i = ians;
int k = 0;
while(i != -1)
{
	way[k] = a[i];
	i = p[i];
	k++;
}	

//Выводим путь в обратном порядке
k--;
while(k >= 0)
{
	out.print(way[k] + " ");
	k--;
}