Расстановка знаков между числами

243
07 августа 2018, 09:20

Даны N чисел. Нужно расставить + и * между ними и получить максимум.
К примеру - 1,2,3,1,2,3
Ответ - 1+2*3*1*2*3 = 37
Есть ли у Вас идеи, может алгоритмы какие-либо, или статьи с объяснением решения, поделитесь, пожалуйста.

Answer 1

Вы можете использовать рекурсию и сделать это перебором вариантов. Не самая красивая реализация в плане производительности, но в плане читаемости очень даже.

Получится дерево переборов. В листах дерева (когда будет получена полная подстановка знаков) вычисляете выражение и сравниваете с максимумом.

Код будет что-то наподобие такого:

using namespace std;
vector<char> signs = { '+', '-', '*', '%', '/' };
int maxValue = 0;
vector<char> combin;
int calculateExpression(const vector<int> &, const vector<char> &);
void recursiveFunction(const vector<int> & values, vector<char> & combination, size_t level) 
{
  if(level == combination.size()) // Комбинация сформирована, можно вычислять.
  {
    int value = calculateExpression(values, combination);
    if(value > maxValue) {
      combin = combination;
      maxValue = value;
    }
    return;
  }
  for(int i = 0; i < signs.size(); i++) {
    combination[level] = signs[i];
    recursiveFunction(values, combination, level + 1);
  }
}
int main()
{
  vector<int> digits { 1, 2, 3, 4, 5};
  vector<char> combinations(digits.size() - 1);
  recursiveFunction(digits, combinations, 0);
  cout << "Максимальное значение: " << maxValue << endl;
  cout << "Комбинация знаков: ";
  for(int i = 0; i < combin.size(); ++i) {
    cout << digits[i] << " " << combin[i] << " " << digits[i + 1] << " ";
  }
  cout << endl;
}

Функцию calculateExpression напишите сами. И вектора также исправите на обычные массивы, если нужно.

Что касается вычисления выражения, то здесь вам в помощь обратная польская запись. Реализуется просто, статей предостаточно.

READ ALSO
Как переопределить сигнал в qt?

Как переопределить сигнал в qt?

У меня вопрос как переопределить сигнал в Qt?

271
Не выполняется служба

Не выполняется служба

Когда запускаешь просто exe, все работаетКогда запускаешь службу, пишет только первую часть, цикл while (!pRstAuthors->EndOfFile) не выполняется

200
mariadb jdbc не работает - No suitable driver found for jdbc:mariadb://localhost:3306/statsDB

mariadb jdbc не работает - No suitable driver found for jdbc:mariadb://localhost:3306/statsDB

Пытаюсь подключиться к mariadb через jbdc отсюда: https://mariadbcom/kb/en/library/about-mariadb-connector-j/

349
Как сделать первую букву в строке жирной? - Android

Как сделать первую букву в строке жирной? - Android

Пытался через HtmlfromHtml, но не получается

181