[Динамическое программирование, вопрос 13] Самая длинная возрастающая подпоследовательность и& последовательность поворотов

300. Самая длинная возрастающая подпоследовательность.

Ссылка: 300. Самая длинная возрастающая подпоследовательность

1. Представление статуса *
dp[i] представляет:длину самой длинной возрастающей подпоследовательности среди «всех подпоследовательностей», заканчивающейся элементом в позиции i .

2. Уравнение перехода состояний.
Для dp[i] мы можем провести классификационное обсуждение на основе «метода композиции подпоследовательности»:

  1. i. Длина подпоследовательности равна 1: в данный момент вы можете играть только самостоятельно, dp[i] = 1;
  2. ii. Длина подпоследовательности больше 1: nums[i] может следовать за любым предыдущим числом, образуя подпоследовательность. Предположим, что нижний индекс предыдущего числа равен j, где 0 <= j <= i - 1.

Пока nums[j] < nums[i], элемент в позиции i следует за элементом j, образуя возрастающую последовательность длиной
dp[j] + 1.
Поэтому нам нужно найти только наибольшее dp[j] + 1, отвечающее требованиям.
Подводя итог, dp[i] = max(dp[j] + 1, dp[i])где 0 <= j <= i - 1 && nums[j]< nums[i]

3. Инициализация.
Все элементы «по отдельности» могут образовывать возрастающую подпоследовательность, поэтому все элементы в таблице dp могут быть инициализированы значением 1.
4. Порядок заполнения формы
легко увидеть, порядок заполнения формы - «слева направо».

5. Возвращаемое значение.
Поскольку мы не знаем, кем заканчивается самая длинная возрастающая подпоследовательность, возвращается «максимальное значение» в таблице dp.

Код:

 int lengthOfLIS(vector<int>& nums) {
    
    
      int n=nums.size();

        vector<int> dp(n,1);
        int Max=1;
        for(int i=1;i<n;i++)
        {
    
    
            for(int j=0;j<i;j++)
            {
    
    
                if(nums[i]>nums[j])
                dp[i]=max(dp[j]+1,dp[i]);
            }
            Max=max(Max,dp[i]);
        }
        return Max;
    }

Вставьте сюда описание изображения

376. Последовательность взмахов

Ссылка: 376. Последовательность взмахов.

Если разница между последовательными числами строго чередуется между положительными и отрицательными числами, последовательность чисел называется последовательностью колебания. Первое отличие (если оно имеется) может быть положительным или отрицательным. Последовательности, содержащие только один элемент или два неравных элемента, также считаются последовательностями колебаний.

Например, [1, 7, 4, 9, 2, 5] является колеблющейся последовательностью, поскольку разница (6, -3, 5, -7, 3) чередуется между положительной и отрицательной.

Напротив, [1, 4, 7, 2, 5] и [1, 7, 4, 5, 5] не являются качающимися последовательностями. Первая последовательность связана с тем, что ее первые две разности являются положительными числами. Вторая последовательность, потому что его последняя разница равна нулю.
Подпоследовательность можно получить, удалив некоторые (или нет) элементы из исходной последовательности, оставив оставшиеся элементы в исходном порядке.

Учитывая целочисленный массив nums, верните длину самой длинной подпоследовательности в nums как последовательность колебаний.

Пример 1:

Ввод: nums = [1,7,4,9,2,5]
Выход: 6
Объяснение: Вся последовательность представляет собой последовательность качаний, а разница между каждым элементом равна (6, -3, 5, -7, 3). .
Пример 2:

Ввод: nums = [1,17,5,10,13,15,10,5,16,8]
Выход: 7
Объяснение: Эта последовательность содержит несколько последовательностей колебаний длиной 7.
Один из них — [1, 17, 10, 13, 10, 16, 8], а разница между элементами равна (16, -7, 3, -3, 6, -8).
Пример 3:

Ввод: числа = [1,2,3,4,5,6,7,8,9]
Вывод: 2

1. Индикация состояния *

  1. f[i] означает: среди всех подпоследовательностей, заканчивающихся элементом позиции i, длину самой длинной последовательности колебаний, в которой последняя позиция показывает «восходящий тренд»;
  2. g[i] представляет собой: среди всех подпоследовательностей, заканчивающихся элементом позиции i, длину самой длинной последовательности колебаний, в которой последняя позиция показывает «нисходящий тренд».

2.
Из-за особого состава подпоследовательности уравнения перехода состояний позиция i является конечной подпоследовательностью, а предыдущая позиция может быть любой позицией из [0, i - 1], поэтому пусть j будет [0, i - 1]. 1] Определенная позиция внутри интервала.
Для f[i] мы можем провести обсуждение классификации на основе «формы подпоследовательности»:

  1. i. Длина подпоследовательности равна 1: в этот момент вы можете играть только сами, f[i] = 1
  2. ii. Длина подпоследовательности больше 1: поскольку конец должен показывать восходящий тренд, должно быть выполнено условие nums[j] < nums[i]. При этом условии конец j должен показывать нисходящий тренд. Самая длинная последовательность колебаний — это g[j] + 1.
    Поэтому нам нужно найти максимум g[j] + 1 при всех удовлетворяющих условиях.

Подводя итог, f[i] = max(g[j] + 1, f[i])обратите внимание, что при использовании g[j] требуется суждение.
g[i] аналогично.

3. Инициализация.
Все элементы «по отдельности» могут образовывать последовательность качаний, поэтому все элементы в таблице dp могут быть инициализированы значением 1.
4. Порядок заполнения формы
легко увидеть, порядок заполнения формы - «слева направо».

5. Возвращаемое значение
должно возвращать «максимальное значение двух таблиц dp». Мы можем обновить «максимальное значение» при заполнении формы.

Код:

 int n=nums.size();

        vector<int> f(n,1),g(n,1);
        int Max=1;
        for(int i=1;i<n;i++)
        {
    
    
            for(int j=0;j<i;j++)
            {
    
    
                if(nums[i]>nums[j])
                {
    
    
                    f[i]=max(f[i],g[j]+1);
                }
                if(nums[i]<nums[j])
                {
    
    
                    g[i]=max(f[j]+1,g[i]);
                }
                Max=max(Max,max(g[i],f[i]));
            }
        }
        return Max;

Вставьте сюда описание изображения

Acho que você gosta

Origin blog.csdn.net/m0_64579278/article/details/132797294
Recomendado
Clasificación