牛客网2017校招真题--合唱团
题目描述
解题思路
代码
#include<iostream>
#include<vector>
#include<algorithm> // max和min函数包含在该头文件中
using namespace std;
int main()
{
int n;
while (cin >> n) // 输入n
{
vector<int> a(n); // 定义vector类的对象
for (int i = 0; i < n; i++)
{
cin >> a[i]; // n 个整数,按顺序表示每个学生的能力值 ai
}
int k, d;
cin >> k >> d; //输入k和d
vector<vector<long long>> dp_max(n, vector<long long>(k + 1, 0)); //创建n*(k+1)的二维数组dp_max
vector<vector<long long>> dp_min(n, vector<long long>(k + 1, 0)); //创建n*(k+1)的二维数组dp_min
//dp_max[i][j],dp_min[i][j]分别表示以第i个人为结尾,选择j个人的最大乘积和最小乘积
for (int i = 0; i < n; i++)
{
dp_max[i][1] = a[i]; //当以第i个人为结尾,选择1个人的最大乘积
dp_min[i][1] = a[i]; //当以第i个人为结尾,选择1个人的最小乘积
}
for (int i = 0; i < n; i++)
{
for (int j = 2; j <= k; j++)
{
if (i >= j)
{
for (int m = max(0, i - d); m <= i - 1; m++)
{
dp_max[i][j] = max(dp_max[i][j], max(dp_max[m][j - 1] * a[i], dp_min[m][j - 1] * a[i]));
dp_min[i][j] = min(dp_min[i][j], min(dp_min[m][j - 1] * a[i], dp_max[m][j - 1] * a[i]));
}
}
}
}
long long max_value = 0;
for (int i = 0; i < n; i++)
{
max_value = max(max_value, dp_max[i][k]); // 最大能力值的乘积
}
cout << max_value << endl;
}
system("pause"); // 程序运行完后不让窗口一闪而过
return 0;
}