ДП. Оптимизация и не правильный вывод ответа

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

введите сюда описание изображения Вот первый код он не проходит по времени поэтому ниже я переделал добавим проверку на число, чтобы последующее должно быть больше предыдущего Первый код:


def calculate_max_team_size(skill_levels):
    skill_count = len(skill_levels)
    team_sizes = []

    for index in range(0, skill_count):
        dp = [0] * skill_count
        dp[index] = skill_levels[index]
        for sub_index in range(index + 1, skill_count):
            if skill_levels[sub_index] <= max(dp[:sub_index]):
                dp[sub_index] = skill_levels[sub_index]
        team_sizes.append(len(dp) - dp.count(0))

    return max(team_sizes)


def main():
    test_cases = int(input())
    for _ in range(test_cases):
        candidate_count = int(input())
        skill_levels = list(map(int, input().split()))
        results = calculate_max_team_size(skill_levels)
        print(results)


main()

Не проходит по некоторым тестам Второй код:

def max_team_size_1(skills):
    n = len(skills)
    dp_1 = []

    for i in range(0, n):
        dp = [0] * n
        dp[i] = skills[i]  # Инициализация dp с текущим навыком

        # Проверка, есть ли уже предыдущие элементы в dp_1
        if len(dp_1) > 0:
            # Если текущий навык больше максимального из предыдущих
            if skills[i] > max(skills[:i]):
                for j in range(i + 1, n):
                    # Проверка, может ли следующий кандидат быть добавлен
                    if skills[j] <= max(dp[:j]):
                        dp[j] = skills[j]
                dp_1.append(len(dp) - dp.count(0))  # Подсчет размера команды
                print(dp)  # Для отладки
            else:
                continue  # Если текущий навык не подходит, переходим к следующему i
        else:
            # Если dp_1 пуст, просто добавляем текущий навык
            for j in range(i + 1, n):
                if skills[j] <= max(dp[:j]):
                    dp[j] = skills[j]
            dp_1.append(len(dp) - dp.count(0))  # Подсчет размера команды
            print(dp)  # Для отладки

    return max(dp_1)  # Возвращаем максимальный размер команды


def main_1():
    t = int(input())
    for _ in range(t):
        n = int(input())
        if n == 1:
            print(1)  # Если только один кандидат, команда из одного
        else:
            skills = list(map(int, input().split()))
            results = max_team_size_1(skills)
            print(results)


main_1()

Параметр skills:Это список, содержащий уровни навыков сотрудников.

Переменные: n: количество сотрудников (длина списка skills). dp_1: список, который будет хранить размеры команд для каждого кандидата.

Внешний цикл: Проходит по каждому кандидату (индекс i от 0 до n - 1). Создает массив dp, который будет хранить уровень навыков, которые могут быть включены в команду, начиная с текущего кандидата.

Инициализация dp: dp[i] = skills[i]: устанавливает уровень навыка текущего кандидата в массиве dp.

Проверка на наличие предыдущих элементов в dp_1: Если dp_1 не пуст, проверяется, больше ли текущий уровень навыка skills[i] максимального уровня навыка среди всех предыдущих кандидатов (max(skills[:i])). Если да, то продолжаем добавлять кандидатов в dp.

Внутренний цикл: Проходит по всем последующим кандидатам (от i + 1 до n - 1).Проверяет, может ли текущий кандидат быть добавлен в команду, сравнивая его уровень навыка с максимальным уровнем среди всех уже добавленных кандидатов в dp. Если условие выполняется, добавляет уровень навыка в dp.

Подсчет размера команды:len(dp) - dp.count(0): вычисляет размер команды, вычитая количество нулей в dp (поскольку нули обозначают, что кандидат не был включен в команду).

Добавление размера команды: Добавляет полученный размер команды в список dp_1.

Возврат результата: Возвращает максимальный размер команды из всех возможных, который был сохранен в dp_1.


Ответы (1 шт):

Автор решения: andr124

По мотивам вашего первого варианта, пробуйте на время

def calculate_max_team_size(skill_levels):
    team_size = 0
    skill_count = len(skill_levels)
    for i in range(0, skill_count):
        next_team_size = 1
        for sub_i in range(i + 1, skill_count):
            if skill_levels[i] > skill_levels[sub_i] - 1:
                next_team_size += 1
        team_size = next_team_size if next_team_size > team_size else team_size
        if team_size + 1 > skill_count - i:
            return team_size
    return team_size


def main():
    test_cases = int(input())
    for _ in range(test_cases):
        candidate_count = int(input())
        skill_levels = list(map(int, input().split()))
        results = calculate_max_team_size(skill_levels)
        print(results)


main()
→ Ссылка