小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 表示學生的...