動態規劃 合唱團問題解析(二)

2022-09-01 19:18:16 字數 1014 閱讀 9986

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

輸入:每個輸入包含

1 個測試用例。每個測試資料的第一行包含乙個整數 n (1 <= n <= 50),表示學生的個數,接下來的一行,包含 n

個整數,按順序表示每個學生的能力值 ai(-50 <= ai <= 50)。接下來的一行包含兩個整數,k 和 d (1 <= k

<= 10, 1 <= d <= 50)。

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

在討論了簡化的問題之後,現在我們回過頭來再看原問題,我們可以發現原問題就是在簡化的問題上加了兩個限制條件,乙個是在這 n 個數中可以取到負值,另乙個是取到的這 n 個數的索引值之間的差不能超過乙個限定值 d。

對於第乙個限制條件,我們必須考慮到當偶數個負值相乘時也可能產生最大的乘積,而能產生最大乘積的負數必然是其中最小的負數。所以我們可以以同樣地動規方法開闢另乙個空間去儲存計算出的最小負值,然後在我們求最大值得時候,當選擇了乙個固定的值 n,我們必須從其與儲存的最大值的積 (n*dpmax) 和儲存的最小值的積 (n*dpmin) 中選出最大的值。同樣地,我們必須更新儲存最小負值的矩陣,當選擇了乙個固定的值 n,我們必須從其與儲存的最大值的積和儲存的最小值的積中選出最小的值。

對於第二個限制條件,只要修改向前搜尋的最大值的範圍就可以了,但要注意的是當這個範圍越界的時候我們要做相應的處理。最終實現的**如下所示:

1

long

long singproblem(int a, int n, int k, int

d) 11

else16}

17if (j == k) result =max(result, dpmax[i]);18}

19}20return

result;

21 }

合唱團(動態規劃問題)

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

動態規劃 合唱團

動態規劃 合唱團 時間限制 1 sec 記憶體限制 64 mb 提交 31 解決 9 提交 狀態 討論版 n位同學站成一排,墨老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他...

合唱團 動態規劃

合唱團 問題描述 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?dp i j 表示 依次選好第i個學生時 他在隊伍裡排第j名能力值乘積最大為多少 應...