题解 | #合唱团#
添加逗号
https://www.nowcoder.com/practice/f51c317e745649c0900996fd3f683aed
思路
线性dp
过程
代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 60;
const int INF = 0x3f3f3f3f3f3f3f3f;
int a[N], n, k, d;
LL f[N][N], g[N][N];
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
cin >> k >> d;
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= i;j ++)
{
if(j == 1) f[i][1] = g[i][1] = a[i];
else f[i][j] = -INF, g[i][j] = INF;
}
}
for(int i = 2;i <= n;i ++)
{
for(int j = 2;j <= i;j ++)
{
int l = max(i - d, j - 1), r = i - 1;
for(int p = l;p <= r;p ++)
{
f[i][j] = max(f[i][j], max(f[p][j - 1] * a[i], g[p][j - 1] * a[i]));
g[i][j] = min(g[i][j], min(f[p][j - 1] * a[i], g[p][j - 1] * a[i]));
}
}
}
LL ans = -INF;
for(int i = k;i <= n;i ++) ans = max(ans, f[i][k]);
cout << ans << endl;
return 0;
}