Zig-Zag序列[动态编程]错误

时间:2015-01-06 17:35:00

标签: c++ algorithm debugging dynamic-programming

我目前正在学习DP,我正在通过topsider教程学习,并且正在尝试解决问题ZigZag sequence,并且理解并知道解决方案与计算长度最长的子序列非常相似。我按如下方式编写了一个简单的c ++ DP解决方案:

#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
    int n = 50;
    int numbers[] =         
{ 374, 40, 854, 203, 203, 156, 362, 279, 812, 955, 
600, 947, 978, 46, 100, 953, 670, 862, 568, 188, 
67, 669, 810, 704, 52, 861, 49, 640, 370, 908, 
477, 245, 413, 109, 659, 401, 483, 308, 609, 120, 
249, 22, 176, 279, 23, 22, 617, 462, 459, 244 };
    vector<int> length(n, 1);
    for(int i = 1;i < n;i++)
    {
        for(int j = (i - 1);j >= 0;j--)
        {
            if(length[j] + 1 > length[i])
            {
                if(length[j] % 2 == 0)
                {
                    if(numbers[i] - numbers[j] < 0)
                    {
                        length[i] = length[j] + 1;
                    }
                }
                else
                {
                    if(numbers[i] - numbers[j] > 0)
                    {
                        length[i] = length[j] + 1;
                    }
                }
            }
        }
    }
    printf("%d\n", *(max_element(length.begin(), length.end())));
}

但问题是代码适用于所有其他情况,除了这一个:

{ 374, 40, 854, 203, 203, 156, 362, 279, 812, 955, 
600, 947, 978, 46, 100, 953, 670, 862, 568, 188, 
67, 669, 810, 704, 52, 861, 49, 640, 370, 908, 
477, 245, 413, 109, 659, 401, 483, 308, 609, 120, 
249, 22, 176, 279, 23, 22, 617, 462, 459, 244 }

我的代码打印答案35,而上层人员认为它是36。我知道我在程序中犯了一些愚蠢的错误,但是现在已经有很长一段时间试图找到它,其他人可以帮助我找出错误吗?

1 个答案:

答案 0 :(得分:3)

我怀疑问题是第一个区别可能是正面还是负面,但是你的代码只支持其中一个案例。

也许你应该运行这个代码两次,一次是肯定的,然后是第二次,负面的。