Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 20:45   #1
ARV.net
 
Регистрация: 01.11.2012
Сообщений: 8
По умолчанию Нахождение самой длинной последовательности

Всем привет. Помогите решить такую задачку. Дана I-я последовательность чисел, нужно найти самую длинную возрастающею последовательность этой последовательности.
Например: Для последовательности: 5,6,4,2,3,5,7,8,9,3,6,5 будет: 2,3,5,7,8,9.
ARV.net вне форума Ответить с цитированием
Старый 01.11.2012, 21:29   #2
Adarron
 
Регистрация: 20.10.2012
Сообщений: 4
По умолчанию

Алгоритм прост:
1. Считаем что сначала максимальная подпоследовательность имеет длину 1 и собственно границы 0-0 (1 элемент)
2. Проходим по массиву со второго до последнего элемента, каждый раз сравнивая с предыдущим.
Добавляем пару операций для хранения границ и получится что то следующее:
Код:
const int n = 20;

int[] a = new int[n];

Random ra = new Random();

for (int i = 0; i < a.Length; i++)
{
    a[i] = ra.Next(0, 100);
    Console.Write(a[i] + " ");
}
Console.WriteLine();

int aL = 0;
int aR = 0;
int l = 0;
int len = 1;
for (int i = 1; i < n; i++)
{
    if (a[i] > a[i - 1])
    {
        len++;
    }
    else
    {
        if (len > (aR - aL + 1))
        {
            aL = l;
            aR = i-1;
        }
        len = 1;
        l = i;
    }
}
Console.WriteLine(aL + " " + aR);
a - массив
aL - левая граница макс. подпослед
aR - правая граница макс подпослед
Adarron вне форума Ответить с цитированием
Старый 02.11.2012, 18:02   #3
ARV.net
 
Регистрация: 01.11.2012
Сообщений: 8
По умолчанию

Эта программа выводит 2 числа которых даже в последовательности нет, по моему это маленько не то)))

Последний раз редактировалось ARV.net; 02.11.2012 в 18:32.
ARV.net вне форума Ответить с цитированием
Старый 02.11.2012, 20:25   #4
D61C76h
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 24
По умолчанию

Код:
        static void Main(string[] args)
        {
            int[] inputData = new int[] {5, 6, 4, 2, 3, 5, 7, 8, 9, 3, 6, 5};
            int[] result = FindSequence(inputData).ToArray();
            foreach (int item in result)
                Console.Write("{0} ", item);
            Console.WriteLine();
            Console.WriteLine("Press <ENTER>");
            Console.ReadLine();
        }

        static IEnumerable<int> FindSequence(IEnumerable<int> sequence)
        {
            List<List<int>> results = new List<List<int>>();
            int[] arr = sequence.ToArray<int>();
            
            List<int> item = new List<int>();
            item.Add(arr[0]);
            
            for (int i = 1; i < arr.Length; i++)
            {
                if (arr[i] > arr[i - 1])
                {
                    item.Add(arr[i]);
                }
                else
                {
                    results.Add(item);
                    item = new List<int>();
                    item.Add(arr[i]);
                }
            }
            
            if (results.Count == 0)
                return sequence;
            return results.OrderBy(r => r.Count).Last();
        }
    }

Последний раз редактировалось D61C76h; 03.11.2012 в 11:33. Причина: Устранение ошибки
D61C76h вне форума Ответить с цитированием
Старый 03.11.2012, 09:13   #5
ARV.net
 
Регистрация: 01.11.2012
Сообщений: 8
По умолчанию

D61C76h
Что -то она как-то не адекватно ведёт себя при вводе других значений,
выводит первую возрастающею последовательность, при вводе всех возрастающих чисел, отладка останавливается и пишет что последовательность не содержит элементов
ARV.net вне форума Ответить с цитированием
Старый 03.11.2012, 11:35   #6
D61C76h
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 24
По умолчанию

Исправил код в предыдущем посте
D61C76h вне форума Ответить с цитированием
Старый 03.11.2012, 11:53   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
            int[] a = new int[] { 5, 6, 4, 2, 3, 5, 7, 8, 9, 3, 6, 5 };
            int n=0,q=0;
            for (int i = 0; i < a.GetLength(0); i++) {
                int k = 0,j=i;
                for (; i < a.GetLength(0) - 1 && a[i] < a[i + 1]; i++) k++;
                if (k > n) { q = j; n = k; }
            }
            for (; q < a.GetLength(0) - 1 && a[q] < a[q + 1]; q++) Console.Write("{0}, ", a[q]); Console.Write("{0}, ", a[q]);
            Console.ReadKey();
Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2012, 13:06   #8
ARV.net
 
Регистрация: 01.11.2012
Сообщений: 8
По умолчанию

Всем спасибо, очень помогли!
ARV.net вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывести элементы самой длинной ветви бинарного дерева. 7rubin Помощь студентам 1 24.05.2012 22:01
Сравнение последовательности чисел с часть самой себя Tolyman Помощь студентам 19 12.08.2011 15:20
Порядковый номер самой длинной строки в файле tshen Помощь студентам 5 10.06.2010 14:44
Pascal. нахождения самой длинной возрастающей подпоследовательности nemeli Помощь студентам 5 16.02.2010 16:12
Определить, сколько букв в самой длинной фамилии списка. lunnamedl Помощь студентам 4 29.06.2009 11:33