有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?考慮前i名學生:輸入描述:
每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n (1 <= n <= 50),表示學生的個數,接下來的一行,包含 n 個整數,按順序表示每個學生的能力值 ai(-50 <= ai <= 50)。接下來的一行包含兩個整數,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
輸出描述:
輸出一行表示最大的乘積。
輸入例子:
3 7 4 7
2 50
輸出例子:
49
例如:4 7 -5 7 則
f(1,1) = 4 ; h(1,1)=0
f(2,1) = 7 ; h(2,1)=0
f(3,1) = 0 ; h(3,1) = -5
f(4,1) = 7 ; h(3,1) = 0
f(2,2) = 28 ; h(2,2) = 0
f(3,2) = 0 ; h(3,2) = -35
f(4,2) = 49; h(4,2) = -35
f(3,3) = 0 ; h(3,3) = -140
f(4,3) = 196 ; h(4,3) = -245 i
f(a[
i]>0)
: f(
i,j)
=max
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪a[i
]∗f(
i−1)
(j−1
)a[i
]∗f(
i−2)
(j−1
)...
a[i]
∗f(i
−d)(
j−1)
h(i,j)=
max⎧
⎩⎨⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
a[i]
∗h(i
−1)(
j−1)
a[i]
∗h(i
−2)(
j−1)
...a
[i]∗
h(i−
d)(j
−1)
if(a
[i]<0)
: f(
i,j)
=max
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪a[i
]∗h(
i−1)
(j−1
)a[i
]∗h(
i−2)
(j−1
)...
a[i]
∗h(i
−d)(
j−1)
h(i,j)=
max⎧
⎩⎨⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
a[i]
∗f(i
−1)(
j−1)
a[i]
∗f(i
−2)(
j−1)
...a
[i]∗
f(i−
d)(j
−1)
則max
(n,k
)=ma
x
#include
#include
#include
#include
#include
using
namespace
std;
//#define debug_
long
long func(vector
vec, int k, int d)
for (auto i = 1; i <= n;++i)
if (vec[i-1]<0)
}long
long tmp_maxpos,tmp_minneg;
for (auto i = 2; i <= n; ++i)
tmp_maxpos = 0;
tmp_minneg = 0;
for (auto t = i - 1;( t >= i - d && t > 0);--t)
if (tmp_minneg > minneg[t][j - 1])
}if (vec[i-1]>0)
if (vec[i-1]<0)}}
long
long result(0);
for (auto i = 0; i < maxpos.size();++i)
int main()
cin >> k >> d;
#endif
cout
<< func(vec, k, d) << endl;
return
0;}
程式設計題 合唱團
輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生的個數,接下來的一行,包含 n 個整數,按順序表示每個學生的能力值 ai 50 ai 50 接下來的一行包含兩個整數,k 和 d 1 k 10,1 d 50 輸出描述 輸出一行表示最大的乘積。示例1輸...
網易程式設計題 合唱團
實現思路 動態規劃 程式設計題 合唱團 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個 學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行...
合唱團問題
問題 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生...