C 算法:单峰条纹

C 算法:单峰条纹,c,algorithm,numbers,C,Algorithm,Numbers,我有一个算法问题要解决,我有一个带数字的向量,我必须找到最长的单峰条纹(这意味着它可以增加然后减少,但不能超过一次) i、 e:在向量[4 5 8 5 9 6 3]中,45863是单峰条纹,而458593不是,因为它增加到8,然后减少到5,然后再次增加(这是不允许的) 使用动态规划,我成功创建了3个向量: 第一个具有在元素x处停止的最长递增条纹的长度,第二个具有从元素x处开始的最长递减条纹的长度,第三个是前两个的总和 基本上,如果我取第三个向量的最大值,它是最长单峰条纹的长度+1(因为元素x被计

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

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

使用动态规划,我成功创建了3个向量: 第一个具有在元素x处停止的最长递增条纹的长度,第二个具有从元素x处开始的最长递减条纹的长度,第三个是前两个的总和

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

我现在想做的是展示这一点。我想这样使用这些向量:从最大值的位置开始,到向量的开头,使用“for”。我将检查第一个向量中的值,如果该值正好比前一个值小1(第一次它将是第一个向量中最大值的值),我将把该值保留在队列中,稍后显示,然后继续。然后,我将使用第二个向量对向量的第二部分执行几乎相同的操作

我知道这听起来很混乱和复杂,但通过这个例子,它会更清晰

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”的

然后我将显示队列,然后是峰值,然后对第二部分执行相同的操作。 我要45 6 9 7 4 3。(哪个是好的顺序)

我的问题是:这种方法每次都有效吗?我觉得有些事情可能会出问题,所以我做了一些测试,每次都很顺利。我想知道是否有特定的基向量把事情搞砸了。如果你能告诉我你认为那会很好


谢谢你阅读这篇文章,我希望有人能帮助我。

我觉得这很好。如果最佳单峰条纹的最大元素为
e
,则在
A
B
中可以找到最佳的左半部分和右半部分。由于左右序列是完全独立的,所以此方法将始终有效。

在我看来不错。如果正确执行动态规划解决方案,则可以确保找到最佳值,因为它会间接检查所有可能的选择。在这种情况下,序列需要有一个“中心”(停止增加并开始减少的点)。这就是你强制使用的参数

不过有一句话

我要把这个值签入 第一个向量,如果该值为 比上一次精确地少了1 值(第一次为 第一组中最大值的值 向量)我将把该值保存在 排队并稍后显示

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


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

为什么峰值是4而不是5?你是取基向量的最大值还是A的最大值?峰值是9,在A中的值是4。唯一的最大I轨迹是C的最大值,它给出了峰值的位置。是的,我编码了一个堆栈,但我在这里写了队列,没有任何线索。事实上,我担心的是,如果我在堆栈中放置元素时,我放置了两个不在同一条线上的元素,这可能会出错。7 4 9 5 10 ... 有三个好的序列:7910,4910和4510,我不想拿7510为例。这就是我不确定的。直到现在,这一切似乎都不会发生。关于使用规则数组来简化我的代码,你是什么意思,创建一个大小合适的向量并直接将它们放在正确的位置?关于使用数组的问题是,你以后可以从任意方向访问它。关于你的第一个问题。一旦你有了两个数组,1)最长的非递增序列在位置i结束,2)最长的非递增序列从位置i开始,那么你就可以确定你要寻找的序列的“中心”应该在哪里。在那之后,你就可以走了。在您的示例中,假设您发现
5
应该是中心。向左扫描时,您永远不会选择
7 5 10
,因为
7>5
。你必须记录你最后选择的元素是什么,长度比前一个元素小一点是不够的。我的意思是10到中心,但有两个可能增加的条纹相交,比如7 4 9 5 10 2 1=>4 5 10 2 1,而不是7 5 10 2 1。但问题没有发生,要确定他不会发生也不容易。不管怎样,我做了很多测试,每次都有效。谢谢你抽出时间。