51Nod 最長等差數列

2021-09-29 16:33:46 字數 1189 閱讀 6586

題目描述

n個不同的正整數,找出由這些數組成的最長的等差數列。

例如:1 3 5 6 8 9 10 12 13 14

等差子數列包括(僅包括兩項的不列舉)

1 3 5

1 5 9 13

3 6 9 12

3 8 13

5 9 13

6 8 10 12 14

其中6 8 10 12 14最長,長度為5。

輸入

第1行:n,n為正整數的數量(3 <= n <= 10000)。

第2 - n+1行:n個正整數。(2<= a[i] <= 10^9)

輸出

最長等差數列的長度。

輸入樣例101

3568

9101213

14輸出樣例

5一道思維的dp,似乎是2017香港區域賽的原題。

我們用dp[i][j] 表示第乙個數字是a[i],第二個數字是a[j] 的最長等差數列,這個當然是可以列舉的啦,但是不能暴力列舉,肯定tle,所以我們需要優化狀態,因為很多狀態是不需要的,因為列舉i,j之後,有用的資訊不多,所以我們可以考慮列舉j,然後雙指標掃瞄即可。

a[i]+a[k] > a[j]*2 ,當前i大了,所以 i - -

a[i]+a[k] < a[j]*2 ,當前k小了,所以k++

a[i]+a[k] = a[j]*2 ,那麼當前是可以狀態轉移的,dp[i][j] = dp[j][k] +1 ,所以我們需要處理後效性,從後往前列舉即可。

然後這道題卡記憶體了,又因為dp的值不大,所以我們用short int 優化記憶體。

ac**:

#pragma gcc optimize(2)

#include

//#define int long long

using namespace std;

const

int n=

1e4+10;

int n,a[n]

;short

int dp[n]

[n],res;

signed

main()

}}cout

}

51nod 1055 最長等差數列

原題鏈結 1055 最長等差數列 基準時間限制 2 秒 空間限制 262144 kb 分值 80 難度 5級演算法題 n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9...

51nod 1055 最長等差數列

n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9 12 3 8 13 5 9 13 6 8 10 12 14 其中6 8 10 12 14最長,長度為5。input ...

51nod 1055最長等差數列 dp

n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9 12 3 8 13 5 9 13 6 8 10 12 14 其中6 8 10 12 14最長,長度為5。因為沒看清題...