分享

实现

 木俊 2018-08-29
#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");
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多