Algo:Unimodal Streak

时间:2011-04-15 13:04:38

标签: c algorithm numbers

我有解决这个算法问题,我有一个带数字的向量,我必须找到最长的单峰条纹(这意味着它可以增加然后减少,但不会超过一次)。

即:在向量[4 5 8 5 9 6 3]中,45863是单峰条纹而458593不是因为它增加到8然后减少到5然后再增加(这不是允许的)。

使用动态编程我设法创建了3个向量: 第一个具有在元素x处停止的最长增长条纹的长度,第二个具有从元素x开始的最长减少条纹的长度,第三个是前两个的总和。

基本上,如果我取第三个向量的最大值,它就是最长单峰条纹的长度+ 1(因为元素x被计算两次)。

我现在要做的是显示连胜。我正在考虑以这种方式使用这些向量:使用" for"从最大值的位置开始并到达向量的开头。我将检查第一个向量中的值,如果该值比前一个值(第一次是第一个向量中的最大值)小得多,那么我将保留该值队列并稍后显示,然后继续。然后,我将使用第二个向量为向量的第二部分做几乎相同的事情。

我知道这听起来很混乱,但是这个例子会更清楚。

I have this base vector :  
9 4 5 6 9 7 8 3 4 3

1 1 2 3 4 4 5 1 2 1 (first vector) = A
4 2 3 3 4 3 3 1 2 1 (second vector) = B
5 3 5 6 8 7 8 2 4 2 (sum of the two) = C

所以这里最长的条纹是7,峰值是9(或8,但这是相同的。)

所以我想做的是: 峰值是" 4"在第一个向量中,我将检查第一个是" 3"向左走,它 6 ,我把它放在队列中,我现在正在寻找第一个" 2",它的 5 ,在队列中,然后它 4 ,因为它是第一个值为" 1"。

然后我将显示队列,然后显示峰值,然后对第二部分执行相同的操作。 我将有4 5 6 9 7 4 3.(这是很好的顺序)。

我的问题是:这次每次都有效吗?我觉得有些东西会搞砸,所以我做了一些测试,每次都很好。我想知道是否有特定的基础载体可以搞砸了。如果你能告诉我你认为那会很棒!

感谢您阅读所有这些,我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

我觉得这听起来很棒。如果最佳单峰条纹的最大元素为e,那么最好的左半部分和右半部分将在AB中找到。由于左右序列完全独立,因此该方法始终有效。

答案 1 :(得分:0)

对我来说很好看。如果正确实施,动态编程解决方案可确保找到最佳解决方案,因为它间接检查所有可能的选择。在这种情况下,序列需要有一个“中心”(它停止增加并开始减少的点)。这就是你疯狂强迫的参数。

一句话,但

  

我要检查价值   第一个向量,如果该值是   比前一个少了1个   价值(第一次是   第一个中的最大值   我将保持这个价值   排队并稍后再显示。

我认为你真正想要的是堆栈,而不是队列,因为你找到的最后一个元素是你要显示的第一个元素。这适用于第一个向量。

更一般地说,你可以使用常规数组,这对两个向量都有效。