#include<iostream> #include <algorithm> #include <vector> #include <climits> using namespace std; int main() { int n;//学生个数 cout << "输入学生的个数n" << endl; cin >> n; vector<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } int k, d; cout << "相邻两个学生的位置编号的差d" << endl; cin >> d; cout << "选取的学生数k"; cin >> k; //注意,二维向量的使用 vector<vector<long long>> dp_max(n + 1, vector<long long>(k + 1, 0)); //定义时分配k+1个大小的long long 类型空间,并初始化数值全部为0 vector<vector<long long>> dp_min(n + 1, vector<long long>(k + 1, 0));//乘积负负得正 long long res = LLONG_MIN; for (int i = 1; i <= n; i++) { dp_max[i][1] = dp_min[i][1] = a[i];//初始化k=1 i:被选中的人中的最后一个的位置 for (int j = 2; j <= k && j <= i; j++)//j:以i结尾时 选中j个人 j>i无意义 { //找出 满足条件范围内的 最大乘积 注意限定条件 d for (int l = 1; l <= d && i - l > 0; l++) { dp_max[i][j] = max(dp_max[i][j], max(dp_max[i - l][j - 1] * a[i], dp_min[i - l][j - 1] * a[i])); dp_min[i][j] = min(dp_min[i][j], min(dp_max[i - l][j - 1] * a[i], dp_min[i - l][j - 1] * a[i])); } } res = max(res, dp_max[i][k]); } cout << res << endl; system("pause"); }
|
|
来自: 木俊 > 《2018-8-29》