網易程式設計題 合唱 Python

2021-08-21 13:38:47 字數 1732 閱讀 2753

小q和牛博士合唱一首歌曲,這首歌曲由n個音調組成,每個音調由乙個正整數表示。

對於每個音調要麼由小q演唱要麼由牛博士演唱,對於一系列音調演唱的難度等於所有相鄰音調製化幅度之和, 例如乙個音調序列是8, 8, 13, 12, 那麼它的難度等於|8 - 8| + |13 - 8| + |12 - 13| = 6(其中||表示絕對值)。

現在要對把這n個音調分配給小q或牛博士,讓他們演唱的難度之和最小,請你算算最小的難度和是多少。

如樣例所示: 小q選擇演唱難度為1, 牛博士選擇演唱難度為2,難度之和為3,這乙個是最小難度和的方案了。

輸入描述:

輸入包括兩行,第一行乙個正整數n(1 ≤ n ≤ 2000) 第二行n個整數v[i](1 ≤ v[i] ≤ 10^6), 表示每個音調。

輸出描述:

輸出乙個整數,表示小q和牛博士演唱最小的難度和是多少。

示例1

輸入

5

1 5 6 2 1

輸出

**:

## dp[i][j]表示,小q唱到了第i個字元,牛博士唱到了第j個字元

## 分為兩種情況,當前時刻dp[i][j]前一時刻是小q唱還是牛博士唱

n = int(input()) ##輸入個數

data = list(map(int, input().split())) ##輸入音符數列

# 求音符前後差值,初始值設為0

dif = [0]

for i in range(1,n):

# 初始化二維列表,初始化為0

# 如果只有兩個音符時,兩個唱,難度係數最小,為0

# 因此只需從三個音符開始計算

dp = [[0]*n for

_ in range(n)]

# 從第3個字元開始時,假設之前的都是小q唱,則有j=i-1

# 則有dp[i][j]=dp[i][i-1],其前時刻的難度和為 dp[i-1][j]=dp[i-1][i-2]

# 因為是小q連唱,前時刻差值為dif[i-1]

# 當前難度和dp[i][j]=dp[i][i-1]=dp[i-1][i-2] + dif[i-1]

for i in range(2,n):

dp[i][i-1] = dp[i-1][i-2] + dif[i-1]

# 從第3個字元開始時,假設前1時刻不是小q唱,則有j# 其小q上一時刻唱的難度和為 dp[i-1][j],

# 加上當前差值為dif[i]

# 因此當前時刻難度和為 dp[i][j] = dp[i-1][j] + dif[i]

# 再取判斷兩種情況的最小值

for i in range(2,n):

for j in range(i-1):

dp[i][j] = dp[i-1][j] + dif[i]

dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + abs(data[i] - data[j]))

# 最後一排為難度累計和,取最小即可

print (min(dp[n-1][:-1]))

網易程式設計題 合唱團

實現思路 動態規劃 程式設計題 合唱團 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個 學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行...

python 合唱團 網易

題目描述 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 ...

合唱團 2016網易內推程式設計題

有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生的...