最長端流子陣列 動態規劃

2021-10-07 13:09:52 字數 1296 閱讀 2787

當 a 的子陣列 a[i], a[i+1], …, a[j] 滿足下列條件時,我們稱其為湍流子陣列:

也就是說,如果比較符號在子陣列中的每個相鄰元素對之間翻轉,則該子陣列是湍流子陣列。

返回a的最大湍流子陣列的長度。

解題思路:這道題要我們找到乙個子陣列,該子陣列所有兩個相鄰的資料是一大一小的,因此我們可以用乙個一維的dp陣列,該陣列的含義是,以它為最後的乙個數字的端流子陣列的長度,因此我們可以得到乙個動態轉移方程

dp[i] = dp[i-1]+1,當a[i]跟前面a[i-1]能夠形成端流子陣列時

dp[i] = 2, 如果跟前面的無法形成端流子陣列,但是跟前面的值不相等,那就跟前面乙個數重新組成端流子陣列

dp[i] = 1, 如果a[i]跟前面的值相同,那這時候要跟前面組成端流子陣列也沒辦法了,因此dp[i]只能等於1

我們看一下**實現部分,首先我們需要定義乙個flag標誌數字,flag的含義為a[i]應該小於a[i-1] (當flag=0)還是大於a[i-1] (當flag=1),當a[i-1] == a[i-2] 時,我們將flag置為-1,表示我們不知道應該將flag置為多少,讓a[i]跟a[i-1]比較後重新判斷首先初始化

dp[0] = 1; //首先,第乙個數字滿足端流子陣列,所以初始化為1

if(a[1]>a[0])

//如果a[1]大於a[0],那a[2]應該小於a[1],所以我們將flag置為0,0表示小於

else if(a[1]迴圈結構的**

for(int i=2; ia[i-1])

//如果滿足,那麼這個端流子陣列可以直接擴充套件乙個長度

else if(a[i]a[i-1])

dp[i] = 2;

else

}else // flag=-1,重新判斷flag

else

//這裡的操作跟初始時一模一樣

}max = math.max(max, dp[i]);

}

結果

這次是唯一一次自己做出來的,之前做了十幾道題,總是想不出來,都快懷疑自己做題有沒有用了,這次是一次提交一次過,算是有進步了^_^

978 最長湍流子陣列 動態規劃

978.最長湍流子陣列 author wsq date 2020 10 20 當 a 的子陣列 a i a i 1 a j 滿足下列條件時,我們稱其為湍流子陣列 若 i k j,當 k 為奇數時,a k a k 1 且當 k 為偶數時,a k a k 1 或 若 i k j,當 k 為偶數時,a k...

動態規劃 陣列中最長遞減子串行

求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...

動態規劃 陣列中最長遞減子串行

求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...