我的解决方案有什么问题 - SPOJ - ALTSEQ?

时间:2016-07-05 15:40:32

标签: c++

我需要做什么:我需要在SPOJ上解决[ this ]问题。

给定一个N个整数的数组a1,a2,a3,... aN我必须找到数组中最长的交替子序列的长度。
交替序列b1,b2 ... bk,k> = 1是具有以下2个属性的序列:

  1. | B1 |< | B2 |< | B3 |< .....< | BK |
  2. 符号在相邻元素之间交替,即,如果b1> 0然后b2 <0,b3> 0,依此类推。或者,如果b1 <0,则b2> 0,b3 <0,依此类推。
  3. 我的方法:
    问题是最长增加子序列(LIS)问题的变化。这是我的基于memoization的递归解决方案:

    Description

    我的问题:这个解决方案在判断系统上给出了错误的答案,所以一定有问题。我需要帮助才能弄清楚这个解决方案有什么问题,因为我不能靠自己。

1 个答案:

答案 0 :(得分:1)

我后来发现,求解(i)正在计算dp [i],它是以第i个元素结尾的LIS。因此,整个dp阵列的最大值是正确答案,而不是之前打印的dp [n-1]。

此外,递归解决方案可以转换为自下而上以提高效率。此外,在自下而上,所涉及的两个环中的外部一个可以与输入读取环组合,并且最大dp [i]可以在外环自身内保持跟踪,以避免另一个通过以找到最大值。这应该会导致更快的解决方案。

#include <cstdio>
using namespace std;

int main()
{
    int n, k, m = 0;
    scanf("%d", &n);
    long *a = new long[n];
    int *dp = new int[n];
    for (int i = 0; i < n; i++) {
        scanf("%ld", a+i);
        dp[i] = 1;
        for (int j = 0; j < i; j++)
            if (((a[i] < 0 && a[j] > 0 && -a[i] > a[j]) || (a[i] > 0 && a[j] < 0 && a[i] > -a[j])) && (k = 1 + dp[j]) > dp[i]) dp[i] = k;
        if (dp[i] > m) m = dp[i];
    }
    printf("%d\n", m);
}