試題 演算法訓練 擺動序列

2021-10-19 13:34:08 字數 1595 閱讀 9269

問題描述

如果乙個序列滿足下面的性質,我們就將它稱為擺動序列:

1. 序列中的所有數都是不大於k的正整數;

2. 序列中至少有兩個數。

3. 序列中的數兩兩不相等;

4. 如果第i – 1個數比第i – 2個數大,則第i個數比第i – 2個數小;如果第i – 1個數比第i – 2個數小,則第i個數比第i – 2個數大。

比如,當k = 3時,有下面幾個這樣的序列:

1 21 3

2 12 1 3

2 32 3 1

3 13 2

一共有8種,給定k,請求出滿足上面要求的序列的個數。

輸入格式

輸入包含了乙個整數k。(k<=20)

輸出格式

輸出乙個整數,表示滿足要求的序列個數。

樣例輸入

3樣例輸出

8思路:

從題目中我們獲得了幾個關鍵點,就是使用者輸入的值表示k的值,然後讓1到k的值組出題目要求的擺動序列,我們知道組成一組時一組不可以有重複的數,也要滿足序列個數至少為2。然後在滿足 如果第i – 1個數比第i – 2個數大,則第i個數比第i – 2個數小;如果第i – 1個數比第i – 2個數小,則第i個數比第i – 2個數大。

我們知道當序列個數至少為2時那麼k的值必須大於等於2,那麼序列的個數一定是小於等k的。所以我們可以建立乙個dp[i][j] i表示序列中的數字個數,j表示k的取值.那我們可以知道當j=2時 對應k的滿足上面要求的序列的個數。dp[i][2]=i*(i-1) (i表示對應的k的值)當我們初始化後就是求對應dp的滿足上面要求的序列的個數。

我們dp[i][j]可以把k的上乙個數的對應種數算到裡面去,這種是當沒有加當前k的這個值的序列個數,那我們要加當前k的數那麼就應該找k-1的數在j-1裡面的序列個數就是加當前k有可能組出的擺動序列。那麼轉移方程就是:dp[i][j]=dp[i-1][j]+dp[i-1][j-1]

程式:

n=

int(

input()

)dp=[[

0for i in

range

(n+2)]

for i in

range

(n+2)]

for i in

range(2

,n+1):

dp[i][2

]=i*

(i-1

)#初始化把以知結果填進去

for i in

range(3

,n+1):

#當前的k

for j in

range(3

,i+1):

#當前序列中的個數

dp[i]

[j]=dp[i-1]

[j]+dp[i-1]

[j-1

]#考慮不加當前i的數和加當前i的數的總和 (i表示當前k的範圍值)

print

(sum

(dp[n]

))

藍橋試題 演算法訓練 擺動序列

問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3時,有...

演算法訓練 擺動序列

問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3時,有...

演算法訓練 擺動序列

演算法訓練 擺動序列 時間限制 1.0s 記憶體限制 512.0mb 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於 k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第 i 1個數比第 i 2個數大,則第 i個數比第 i 2個數小 如...