Задача "Лесенка". Как улучшить? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! У меня задание: Коротышка шагает по целочисленному массиву. Шаг не велик, так что шагает либо на каждую ступень, либо через 1. Нужно найти максимальную сумму элементов. Вот мое решение, если кому-то понятней так:
Листинг программы
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. int[] arr = new int[] {0, -3, -5, -12, -125, -21, -122, -150, 150, -155, 0};
  6. int[] way = new int[arr.Length];
  7. Console.WriteLine(Sum(arr,0,way));
  8. /* Проверка
  9. int i = 0;
  10. while (i<way.Length-1)
  11. {
  12. Console.Write(way[i] + "->");
  13. i += way[i];
  14. }
  15. Console.WriteLine("Done");*/
  16. Console.ReadKey();
  17. }
  18. static float Sum(int[]arr, int position, int[] way)
  19. {
  20. if(position>=arr.Length)
  21. {
  22. return 0;
  23. }
  24. float a = Sum(arr, position + 1,way);
  25. float b = Sum(arr, position + 2,way);
  26. if (a > b)
  27. {
  28. way[position] = 1;
  29. return a+arr[position];
  30. }
  31. else
  32. {
  33. way[position] = 2;
  34. return b+arr[position];
  35. }
  36. }
  37. }
Порекомендовали алгоритм сделать со сложностью O(n), а у меня он зависит от величины максимального шага, т.е. O(n2) Может кто хотя бы на естественном языке объяснить, как ускорить до O(n)?

Решение задачи: «Задача "Лесенка". Как улучшить?»

textual
Листинг программы
  1.     static long MySum(int[] arr)
  2.     {
  3.         if (arr.Length == 0)
  4.             return 0;
  5.            
  6.         if (arr.Length == 1)
  7.             return Math.Max(0, arr[0]);
  8.            
  9.         var sums = new long[arr.Length];
  10.        
  11.         sums[sums.Length - 1] = arr.Last();
  12.         sums[sums.Length - 2] = arr[sums.Length - 2] + Math.Max(arr.Last(), 0);
  13.        
  14.         for (int i = sums.Length - 3; i >= 0; i--)
  15.         {
  16.             sums[i] = Math.Max(sums[i + 1], sums[i + 2]) + arr[i];
  17.         }
  18.        
  19.         return Math.Max(sums[0], sums[1]);
  20.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы