//思路:动态规划法
//类同斐波那契数列,考虑k和k-1数组之间的联系。
//但这边需要存储的即有最大正积,也需要存储最小负积。
//查询要在i-d和i+d范围内进行;寻找最大正积和最小负积。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void calcuMaxMulti(int *array, int n, int k, int d,long *mark)
{
//递归出口
if (1 == k)
{
for (int i = 0; i < n; i++)
{
if (array[i] > 0)
{
mark[i] = array[i];
mark[n + i] = 0;
}
else
{
mark[i] = 0;
mark[n + i] = array[i];
}
}
}
//递归
else {
calcuMaxMulti(array, n, k-1, d,mark);
for (int i = n-1; i > k - 2; i--)
{
long max_Plus = 0;
long min_Minus = 0;
for (int j = i - 1; j >= i - d && j >= 0; j--)
{
if (array[i] * mark[j] > max_Plus)
max_Plus = array[i] * mark[j];
if (array[i] * mark[j] < min_Minus)
min_Minus = array[i] * mark[j];
if (array[i] * mark[j + n] < min_Minus)
min_Minus = array[i] * mark[j+n];
if (array[i] * mark[j + n] > max_Plus)
max_Plus = array[i] * mark[j + n];
}
mark[i] = max_Plus;
mark[i + n] = min_Minus;
}
}
for (int i = 0; i < 2 * n; i++)
{
cout << mark[i] << " ";
}
cout << endl;
//返回
}
long calCuMax(int *array,int k,int n,int d,long *mark)
{
long max = 0;
calcuMaxMulti(array, n, k, d,mark);
for (int i = 0; i < n; i++)
{
if (mark[i] > max)
max = mark[i];
}
//cout << max;
//释放内存
//free(mark);
return max;
}
int main()
{
int n, k, d,max;
cin >> n;
int *array = new int[n];
long *mark = new long[2 * n];
for (int i=0;i<2*n;i++)
{
mark[i] = 0;
}
for (int i = 0; i<n; i++)
{
cin >> array[i];
}
cin >> k >> d;
cout << calCuMax(array,k,n,d,mark);
delete [] mark;
delete [] array;
system("pause");
return 0;
}