Почему мой код для самой длинной увеличивающейся подпоследовательности не работает? - PullRequest
0 голосов
/ 02 апреля 2019

Я изменил решение динамического программирования для самой длинной растущей подпоследовательности в соответствии с моим собственным подходом. Исходное решение динамического программирования состоит в том, чтобы установить для таблицы значения по умолчанию, а затем вычислить ее по принципу снизу вверх и вернуть максимальный элемент таблицы. Вместо этого я инициализирую первые несколько записей таблицы, вычисляю их снизу вверх и возвращаю последний элемент таблицы в качестве ответа. Это дало правильный ответ на большинство входов. Когда я тестировал свой код на практике GeeksForGeeks, мой подход к динамическому программированию дал WA для одного из тестовых случаев. Мой код напрямую реализован из рекурсивного определения lis, он должен быть правильным.

#include <stdio.h>

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int T;
    int n;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        int nums[n];
        for (int i = 0; i < n; ++i)
            scanf("%d", &nums[i]);
        int dp[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            dp[i] = 0;
            for (int j = 0; j < i - 1; ++j)
                if (nums[j] < nums[i - 1])
                    dp[i] = max(dp[i], 1 + dp[j + 1]);
        }
        printf("%d\n", dp[n]);
    }
    return 0;
}

Тестовый случай, когда мое решение не удается:

83
86 177 115 193 135 186 92 49 21 162 27 90 59 163 126 140 26 172 136 11 168 167 29 182 130 62 123 67 135 129 2 22 58 69 167 193 56 11 42 29 173 21 119 184 137 198 124 115 170 13 126 91 180 156 73 62 170 196 81 105 125 84 127 136 105 46 129 113 57 124 95 182 145 14 167 34 164 43 150 87 8 76 178

Ожидаемый:

15

Фактический:

14

В чем проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...