簡體   English   中英

最長的遞增子序列

[英]Longest increasing subsequence

任務是在給定的整數數組中找到最長子序列的長度,以使該子序列的所有元素都按升序排序。 例如,{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等等(通過調試器發現了這一點,我鼓勵您研究該工具)。 因人而異。 因此,對我來說, a也被填充,然后N2覆蓋, max_val等也被2覆蓋,然后l2覆蓋,然后循環結束。 然后你回到

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

...現在N2i只是增加到3 然后循環結束,然后程序結束。

也許不用說,這不是您可以依靠的行為。 編譯器不必按此順序排列堆棧變量,優化的編譯器甚至可以生成不將某些變量保存在內存中(或根本不保存)的代碼。 但這就是發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM