给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:
[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;
从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。
区间内的所有数字都在[0, 100]的范围内;
输入描述:
第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据, 1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;
输出描述:
输出数组经过计算后的最大值。
输入例子1:
3
6 2 1
输出例子1:
36
错!!
#include <stdio.h>
#include<iostream>
#include <string.h>
#include <string>
#include <stdlib.h>
#include<vector>
#include<algorithm>
#include<deque>
using namespace std;
/*
10
81 87 47 59 81 18 25 40 56 0
为啥第511往后的vector全是空的
*/
vector<vector<int>> subsets(vector<int>&nums);
//回溯求组合
vector<vector<int>> subsets(vector<int>& nums) {
// base case,返回一个空集
if (nums.empty()) return{ {} };
// 把最后一个元素拿出来
int n = nums.back();
nums.pop_back();
//sort(nums.begin(), nums.end());
// 先递归算出前面元素的所有子集
vector<vector<int>> res = subsets(nums);
int size = res.size();
for (int i = 0; i < size; i++) {
// 然后在之前的结果之上追加
res.push_back(res[i]);
res.back().push_back(n);
}
return res;
}
int main(int argc, char** argv)
{
int n;
vector<int> nums;
vector<vector<int>>results;
cin >> n;
int value;
for (int i = 0; i < n; i++) {
cin >> value;
nums.push_back(value);
}
results = subsets(nums);
int length = results.size();
int MAX = 0;
for (int i = 1; i < length; i++) {
//计算每个vector<int>的值
int sum = 0; //初始化子列的和
int result = 0; //结果= sum*min
int min = 0;//最小的值
for (int j = 0; j < results[i].size(); j++) {
//排除空集
if (!results[i][j] == NULL) {
//求和
sort(results[i].begin(), results[i].end());
sum += results[i][j];
//找出子列表中的最小值
result = results[i][0] * sum;
cout << i << "," << j <<" : "<<result << endl;
}
if (MAX < result)
MAX = result;
}
}
cout << MAX;
}