为什么我的最长递增子序列代码不起作用?

时间:2019-04-02 20:07:06

标签: c dynamic-programming lis

我修改了动态编程解决方案,以使最长的子序列成为我自己的方法。最初的动态编程解决方案是将表设置为默认值,然后以自下而上的方式对其进行计算,并返回表的最大元素。我改为初始化表的前几个条目,然后以不同的方式自下而上计算它,然后返回表的最后一个元素作为答案。它为大多数输入提供了正确答案。当我在GeeksForGeeks practice,上测试代码时,我的动态编程方法将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

出什么问题了?

0 个答案:

没有答案