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

Posted

技术标签:

【中文标题】Zig-Zag 序列[动态编程] 错误【英文标题】:Zig-Zag sequence[Dynamic Programming] bugs 【发布时间】:2015-01-06 17:35:00 【问题描述】:

我目前正在学习 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,而topsider 相信它的36。我知道我在程序中犯了某种愚蠢的错误,但是已经有一段时间了,一直试图找到它,其他人可以帮我找出错误吗?

【问题讨论】:

程序中最大的错误是它没有 cmets。这对于编程竞赛来说很好,但当您将其提交到这样的论坛以寻求帮助和建议时就不行了。 @TonyK 是的,我知道,这是我最大的弱点之一,真的很抱歉我有竞争意识,但我只是有时觉得将 cmets 添加到代码中断的工作流程中,有时会结束乱七八糟的代码...此外,我最近正在为 INOI 做准备,因此我的重点完全是算法,而不是代码之美... 【参考方案1】:

我怀疑问题在于第一个区别可以是正面的也可以是负面的,但您的代码仅支持其中一种情况。

也许你应该运行这段代码两次,一次是正面的,第二次是负面的。

【讨论】:

以上是关于Zig-Zag 序列[动态编程] 错误的主要内容,如果未能解决你的问题,请参考以下文章

拓端tecdat|R语言编程指导时间序列数据指数平滑法分析交互式动态可视化

动态规划--最长递增子序列

用数学语言说一下动态规划求数列最长递增子序列的解

动态规划:基因序列比对

动态规划求解最长公共子序列问题

编程算法 - 最长上升子序列问题 代码(C)