Как определить самую длинную увеличивающуюся подпоследовательность, используя динамическое программирование с объединяемыми входными целыми числами
Я прочитал статью о том, как определить самую длинную увеличивающуюся подпоследовательность, используя динамическое программирование с этим алгоритмом:
int maxLength = 1, bestEnd = 0;
DP[0] = 1;
prev[0] = -1;
for (int i = 1; i < N; i++)
{
DP[i] = 1;
prev[i] = -1;
for (int j = i - 1; j >= 0; j--)
if (DP[j] + 1 > DP[i] && array[j] < array[i])
{
DP[i] = DP[j] + 1;
prev[i] = j;
}
if (DP[i] > maxLength)
{
bestEnd = i;
maxLength = DP[i];
}
}
но я хочу знать, как решить эту проблему с этим условием, что мы можем взять массивы с объединенными целыми числами.
For example: 1,5,3,1,5,6,7,8,1,2,9
we can have this set:1,3,5,6,7,8,12 for solution
that 12 is joint form 1 and 2
Итак, условия: входной массив включает в себя 1-9 чисел! и целые числа могут объединяться из нескольких других целых чисел.
1 ответ
Решение
Оригинальная проблема
dp[i] = max(DP[j] + 1, a[j] < a[i])
Твоя проблема
Позволять:
a[x,y] = a[x] + a[x + 1] + ... + a[y] (+ means concatenate)
Так:
f[x,y] = max(DP[j] + 1, a[j] < a[x,y], j < x)
dp[i] = max(f[i,j], 0 <= j <= i) = max(
max(DP[j] + 1, a[j] < a[i], j < i) # f(i, i)
max(DP[j] + 1, a[j] < a[i-1, i], j < i - 1) # f(i-1, i)
...
)
Если у вас все еще есть проблемы, пожалуйста, оставьте комментарий здесь.