python 合唱團 網易

2021-08-21 15:20:33 字數 1547 閱讀 3680

題目描述 

有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?

輸入描述: 

每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n (1 <= n <= 50),表示學生的個數,接下來的一行,包含 n 個整數,按順序表示每個學生的能力值 ai(-50 <= ai <= 50)。接下來的一行包含兩個整數,k 和 d (1 <= k <= 10, 1 <= d <= 50)。 

輸出描述: 

輸出一行表示最大的乘積。

示例1 

輸入3 

7 4 7 

2 50 

輸出解題參考:

解題思路及**: 

原理類似於迭代求解函式,考慮k=1作為初始點,來推斷k=2時的結果,其中需要注意負負得正。

# f [ i ] [ j ] [ 0 / 1 ]表示,總人數為j,以第i個人為最後乙個人,乘積的最大值和最小值。

# 考慮到負負得正,所以需要保留負數中的最小值。

# 通過公式f[i][j]=max(fm[k][j-1]*stu[j],fn[k][j-1]*stu[j]),可以一次遍歷得出結果

n = int(input())

# 與版本2不同,python3中,map函式返回乙個map物件,而不是list,需要轉換;

# array = list(map(int,input().split()))

k,d = map(int,input().split())

# 初始化三維陣列(大小),由內到外

resarray = [[[0] * 2 for j in range(k+1)] for i in range(n)]

result = 0;

# i表示最後乙個數字於array陣列位置下標i處,j表示當前乘積的數字個數,0、1分別記錄最大值和最小值

# 遍歷個數和位置

for i in range(0,n):

# 當乘積個數為1時,結果為當前這個數。

resarray[i][1][0],resarray[i][1][1]=array[i],array[i]

for j in range(2,k+1):

# 考慮間隔d

for m in range(max(i-d,0),i):

resarray[i][j][0] = max(resarray[i][j][0]

,max(resarray[m][j-1][0]*array[i],resarray[m][j-1][1]*array[i]))

resarray[i][j][1] = min(resarray[i][j][1]

,min(resarray[m][j-1][0]*array[i],resarray[m][j-1][1]*array[i]))

result = max(result,max(resarray[i][k][0],resarray[i][k][0]))

print(result)

合唱團 網易

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

網易程式設計題 合唱團

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

網易 合唱團 動態規劃

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