最长的递增子序列

普拉纳夫阿罗拉

任务是在给定的整数数组中找到最长子序列的长度,以使该子序列的所有元素都按升序排序。例如,{15、27、14、38、26、55、46、65、85}的LIS的长度为6,而增加的最长子序列为{15、27、38、55、65、85}。

以下是我编写的代码。我不确定我的逻辑是否正确,但是代码无法正常运行。如果我尝试输入以下测试用例

9 15 27 14

程序停止读取14之后的值,并给我输出2。它应该读取9个值,但是代码仅读取3个值。我已经多次检查了我的代码,但不幸的是,我无法发现该错误。

#include<stdio.h>
int main()
{
    int N,max_val,i,j,k,l=1;
    int a[100000], track[100000];
    track[0]=0;
    max_val=1;
    scanf("%d",&N);
    for(i=0;i<N;++i)
    {
        printf("x");
        scanf(" %d",&a[i]);
        if(i!=0)
        {
            for(j=0;j<l;++j)
            {
                if(a[i]>a[track[j]])
                {
                    max_val++;
                    track[0]=i;
                    l=1;
                    break;
                }
                else
                {
                    track[l]=i;
                    l++;
                }
            }
        }
    }
    printf("%d",max_val);
    return 0;
}

感谢您的帮助。谢谢!

温特穆特

哦,真是令人费解。您在这里有未定义的行为,它表达自己的方式很有启发性。普遍的问题是

            if(a[i]>a[track[j]])  // <-- when i == 2, this first is false with
            {                     //     your input
                max_val++;
                track[0]=i;
                l=1;
                break;
            }
            else
            {
                track[l]=i;       // <-- and you end up here, where you write 
                l++;              //     into track[l] and increase l.
            }

l增加,你回到环

for(j=0;j<l;++j)

这里j增加了,但是由于l也增加了,所以条件永远不会(除非不是真的,请参阅下文)为假,并且循环继续进行。从这一点开始,

a[i]>a[track[j]]

总是错误的,因为您一直在比较相同的两个数字,所以l每转都会递增,并且这种情况一直在发生。

继续进行直到track满为二(因为i仍然为2)。实际上,它在充满 继续运行track,写入track内存中任何可能发生的情况在C语言标准中没有定义什么。对我来说,这恰好是按声明的顺序先是a,然后是Nmax_val依此类推(用调试器发现了这一点,我鼓励您研究一下该工具)。YMMV。因此,对我来说,a也被填充,然后N被覆盖2max_val等等,也被覆盖2,然后l被覆盖2,然后循环才结束。然后你回到

for(i=0;i<N;++i)

...现在现在N在递增到的位置然后循环结束,然后程序结束。2i3

也许不用说,这不是您可以依靠的行为。编译器不必按此顺序排列堆栈变量,而优化的编译器甚至可以生成不将某些变量保存在内存中(或根本不保存)的代码。但这就是发生的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

最长递增子序列的长度

最长递增子序列优化

最长递增子序列(LIS)

最长的K序列递增子序列

在Python中获得最长的递增子序列

Python中最长的递增子序列(For vs While循环)

使用二进制搜索的最长递增子序列

使用递归找到所有可能的最长的递增子序列

Python 数组中索引的最长递增子序列

NlogN中最长的递增子序列长度。[了解算法]

求最长递增子序列的长度 C++

在C ++中使用std :: set的最长递增子序列

如何调用这个递归最长递增子序列函数

为什么我找到最长的递增子序列而不是最长的递减子序列?

*第一*最长递增子

最长的递增子序列,算法工作不正确,不知道为什么

在列表列表中找到最长的递增子序列的最有效方法

求和最大的递增子序列

最长递增子序列问题 - 返回实际子序列的 n log n 解决方案 - 需要解释/澄清

我们如何保证一个由一个最长的递增子序列和一个最长的递减子序列组成的双音序列?

如何在未加权一般图的所有简单路径中找到最长的递增子序列?

动态规划 - 最大和递增子序列

改进最长递增序列算法

列表中最长的递增序列

我可以解释一下如何使用最佳子结构在此幻灯片中找到最长的递增子序列吗?

使用递归的O(n ^ 2)的最大递增子序列

数组的最长递增数字子序列

向左/向右旋转数组后最长递增子数组的长度

连续字母的最长序列