Сложность: hard
Вам дан целочисленный массив arr. За один ход вы можете выбрать палиндромный подмассив arr[i], arr[i + 1], ..., arr[j], где i <= j, и удалить этот подмассив из данного массива. Обратите внимание, что после удаления подмассива элементы слева и справа от него перемещаются, чтобы заполнить пробел, образовавшийся в результате удаления. Верните минимальное количество ходов, необходимое для удаления всех чисел из массива.
Пример:
Input: arr = [1,2]
Output: 2
👨💻 Алгоритм:
1⃣Базовый случай:
Если подмассив состоит из одного элемента, то его удаление займет 1 ход, поэтому dp[i][i] = 1.
2⃣Рекурсивный случай:
Если arr[i] == arr[j], то мы можем удалить их в одном ходе, если подмассив arr[i+1...j-1] можно удалить за dp[i+1][j-1] ходов, тогда dp[i][j] = dp[i+1][j-1] (если удалим подмассив arr[i+1...j-1] и затем удалим arr[i] и arr[j]).
3⃣В противном случае, минимальное количество ходов для удаления подмассива arr[i...j] будет равно 1 + минимум ходов для удаления каждого из подмассивов arr[i...k] и arr[k+1...j], где i <= k < j. То есть, dp[i][j] = min(dp[i][k] + dp[k+1][j]) для всех k от i до j-1.
😎 Решение:
using System;
public class Solution {
public int MinMovesToDelete(int[] arr) {
int n = arr.Length;
int[,] dp = new int[n, n];
for (int i = 0; i < n; i++) {
dp[i, i] = 1;
}
for (int length = 2; length <= n; length++) {
for (int i = 0; i <= n - length; i++) {
int j = i + length - 1;
if (arr[i] == arr[j]) {
dp[i, j] = length > 2 ? dp[i + 1, j - 1] : 1;
} else {
dp[i, j] = int.MaxValue;
for (int k = i; k < j; k++) {
dp[i, j] = Math.Min(dp[i, j], dp[i, k] + dp[k + 1, j]);
}
}
}
}
return dp[0, n - 1];
}
}
Ставь 👍 и забирай 📚 Базу знаний