Ответ 1
Здесь один из способов его решения с помощью динамического программирования:
Предположим, что в качестве ввода мы имеем число d 0 d 1... d N.
Идея состоит в том, чтобы создать таблицу, в которой ячейка (i, j) хранит продукт d i & middot; d я + 1 & middot;... & middot; д <суб > Jсуб > . Это можно сделать эффективно, поскольку ячейку at (i, j) можно вычислить, умножив число в (i-1, j) на d i.
Так как я (начальный индекс) должен быть меньше или равен j (конечный индекс), мы сосредоточимся на нижнем левом треугольнике таблицы.
После создания таблицы мы проверяем наличие повторяющихся записей.
Здесь конкретное примерное решение для ввода 2673:
-
Мы выделяем матрицу М с размерами 4 & times; 4.
-
Начнем с заполнения диагоналей: M i, i с d i:
-
Затем переходим строки за строкой и заполняем M i, j с d i & middot; M i-1, jк югу >
-
Результат выглядит как
-
Чтобы проверить наличие дубликатов, мы собираем продукты (2, 12, 6, 84, 42, 7, 252, 126, 21, 3), сортируем их (2, 3, 6, 7, 12, 21, 42, 84, 126, 252) и прокрутите, чтобы увидеть, равны ли два последовательных числа. Если это так, мы возвращаем false, иначе true.
В коде Java:
Здесь рабочее решение DP, O (n 2).
public static boolean isColorful(int num) {
// Some initialization
String str = "" + num;
int[] digits = new int[str.length()];
for (int i = 0; i < str.length(); i++)
digits[i] = str.charAt(i) - '0';
int[][] dpmatrix = new int[str.length()][str.length()];
// Fill in diagonal: O(N)
for (int i = 0; i < digits.length; i++)
dpmatrix[i][i] = digits[i];
// Fill in lower left triangle: O(N^2)
for (int i = 0; i < str.length(); i++)
for (int j = 0; j < i; j++)
dpmatrix[i][j] = digits[i] * dpmatrix[i-1][j];
// Check for dups: O(N^2)
int[] nums = new int[digits.length * (digits.length+1) / 2];
for (int i = 0, j = 0; i < digits.length; i++, j += i)
System.arraycopy(dpmatrix[i], 0, nums, j, i+1);
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++)
if (nums[i] == nums[i+1])
return false;
return true;
}
Для читателей, интересующихся DP, я могу порекомендовать несколько аналогичный вопрос/ответ здесь: