n = 3arr = [7,4,7]
k,d = 2,50
fm = [([0] * n) for i in range(k)] # k*d
fn = [([0] * n) for i in range(k)] # k*d
res = 0
# for i in range(n):
# fm[0][i] = arr[i]
# fn[0][i] = arr[i]
## for i in range(n):
# for k in range(1, k):
## for j in range(i - 1, max(0, i - d) - 1, -1):
## fm[k][i] = max(fm[k][i], max(fm[k - 1][j] * arr[i], fn[k - 1][j] * arr[i])) #不要忘記0
# fn[k][i] = min(fn[k][i], min(fm[k - 1][j] * arr[i], fn[k - 1][j] * arr[i]))
## res = max(res, fm[k - 1][i])
# print(res)
n = 3
arr = [7,4,7]
k, d = 2, 50
f_max = [[0]*n for i in range(k)]
f_min = [[0]*n for i in range(k)]
# f_max[i][j] 表示選i+1個人(因為0表示選第乙個人) 最後乙個人必須選j 時的最大成績
# 因為有正負所以要同時構建乙個f_min,
for i in range(n):
f_max[0][i] = arr[i]
f_min[0][i] = arr[i]
for j in range(1,k):
for i in range(n):
#從i-1,到i-d
for m in range(i-1,max(0,i-d)-1,-1): #這步**是核心直接把條件應用到了for迴圈裡面了
f_max[j][i] = max(f_max[j-1][m]*arr[i],f_min[j-1][m]*arr[i])
f_min[j][i] = min(f_max[j-1][m]*arr[i],f_min[j-1][m]*arr[i])
# f_max[j][i] = max(f_max[j][i], max(f_max[j - 1][m] * arr[i], f_min[j - 1][m] * arr[i]))
# f_min[j][i] = min(f_min[j][i], min(f_max[j - 1][m] * arr[i], f_min[j - 1][m] * arr[i]))
print(max(f_max[k-1]))
牛客網 合唱團
有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生的個數,接下...
牛客網 動態規劃(C ) 合唱團
有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?include include include include using namespace std...
合唱團問題
問題 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生...