2015-06-08 3 views
-1

Как вы вычисляете наименьший обход стоимости целочисленного массива с помощью шагов и переходов, а также подсчитываете первый и последний элементы массива? Шаг переходит к следующему непосредственному значению в массиве, например. array [currentIndex + 1], а скачок перемещается двумя точками, например. array [currentIndex + 2]. У меня есть следующая функция, которую я хочу вернуть начальную минимальную сумму, она добавляет первый и последний элементы к сумме, но я застрял на средних значениях массива.Наименьшая стоимость обхода массива

An example of this would be {2, 10, 4, 14, 44, 28, 16, 18} -> 66 
which would add indexes 0, 2, 3, 5, and 7. 

====

public int Cost(int[] board) 
{ 
    int sum = board[0]; 
    int index = 0; 
    while (index < board.Length) 
    { 
     //Add the final array value to the sum 
     if (index + 1 == board.length) 
     { 
      sum += board[index]; 
      break; 
     } 
     //Add other values here 

     index++; 
    } 
    return sum; 
} 
+3

Как бы вы решили это с помощью карандаша и бумаги? Вам нужен алгоритм (пошаговый процесс), прежде чем вы напишете первую строку кода. Каков ваш предложенный алгоритм? – mellamokb

+0

@mellamokb Моя первая мысль заключалась в том, чтобы увидеть, был ли прыжок или шаг меньше, а затем добавить его к сумме и перейти к соответствующему индексу и повторению действия. – user3277752

+0

Это отличная идея. Поэтому, чтобы сделать его более «механическим», 1) взгляните на следующие два числа (шаг против прыжка). 2) сравните, какой из них меньше. 3) возьмите меньший, добавьте его в свою сумму и сделайте следующую отправную точку. Можете ли вы написать код для этого? – mellamokb

ответ

1

Вы можете попробовать это:

public int Cost(int[] board) 
    { 
     int[] cost = new int[board.Length]; 
     for (int i = 0; i < board.Length; i++) { 
      if (i == 0) { 
       cost[i] = board[0]; 
      } else if (i == 1) { 
       cost[i] = board[1] + cost[0]; 
      } else { 
       cost[i] = board[i] + Math.Min(cost[i - 1], cost[i - 2]); 
      } 
     } 
     return cost[board.Length - 1]; 
    } 
+0

Спасибо, что делает то, что я хочу. Я все время попадал на ошибки OutOfBound, но это работает. – user3277752

0

Одно из возможных решений:

public int Cost(int[] board, int step = 1) 
{ 
    if (board == null) return -1; 
    if (board.Length == 0) return 0; 

    // always add first and last index (if its not the first) 
    int sum = board[0]; 

    if (board.Length > 1) sum += board[board.Length - 1]; 

    // assumes step is > 0 
    for (int i = step; i < (board.Length - 1); i += step) 
    { 
     sum += board[i]; 
    } 

    return sum; 
} 

Это позволяет шаг, чтобы быть параметром. Возможно, теперь вы хотите сделать шаг 1 или 2 от начала. Может быть, позже вы захотите сделать 5 пятен.

+0

Это хорошо, но мне нужно уметь определять внутри функции, нужно ли делать 1 или 2 пробела в массиве. Это кажется ограниченным тем, что когда-либо шаг размера передается с шагом. – user3277752

Смежные вопросы