最大子数组的和以及最大子数组的乘积
2017-10-22 13:05
155 查看
正如题目所述,这个写了两个代码,有点类似,但有些差别。
子数组的乘积稍难。
用动态规划解题,转移方程是
下面是代码:
子数组的乘积稍难。
用动态规划解题,转移方程是
dp[t] = func(arr[t], operater(dp[t-1], arr[t]))
下面是代码:
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; float get_abs(const float &val) { return val > 0 ? val : -val; } template <typename T> T get_min(const T &val1, const T &val2) { return val1 > val2 ? val2 : val1; } template <typename T> T get_max(const T &val1, const T &val2) { return val1 > val2 ? val1 : val2; } float get_max_sub_mul(float arr[], int len) { int i = 0; float last_max = 1.0; float last_min = 1.0; float maxp = 0.0; float cur_max = 1.0; float cur_min = 1.0; for (i = 0; i < len; i++) { // last_max last_min 需要存储前面的值,因为需要用两次。 cur_max = get_max<float>(arr[i], get_max<float>(arr[i]*last_max, arr[i]*last_min)); cur_min = get_min<float>(arr[i], get_min<float>(arr[i]*last_max, arr[i]*last_min)); maxp = get_max<float>(maxp, cur_max); last_max = cur_max; last_min = cur_min; } return maxp; } int get_max_sum_arr(int arr[], int len) { int i = 0; int maxp = 0; int max_tmp = 0; int start_ind = 0; int end_ind = 0; for (i = 0; i < len; i++) { if (max_tmp + arr[i] > arr[i]) { max_tmp = max_tmp + arr[i]; } else { max_tmp = arr[i]; start_ind = i; } if (max_tmp > maxp) { maxp = max_tmp; end_ind = i; } } std::cout << "start_ind, end_ind: " << start_ind << ", " << end_ind << endl; std::cout << "max sum: " << maxp << std::endl; return maxp; } int main(int argc, char *argv[]) { int arr[] = {1, -2, 3, 10, -4, 7, 2, -5}; int len = sizeof(arr) / sizeof(int); std::cout << "array data" << std::endl; int i = 0; for (i = 0; i < len; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; std::cout << "max sub sum arr: " << get_max_sum_arr(arr, len) << std::endl; std::cout << "--------------------------" << std::endl; std::cout << "--------------------------" << std::endl; //float arr_f[] = {1, -2, 3, 0.25, 10, -4, 0.35, 7, 2, -5}; float arr_f[] = {1, -2, 0, 3, 0.25, 10, -4, 0.35, 7, 2, -5}; len = sizeof(arr_f) / sizeof(float); std::cout << "array data float: " << std::endl; i = 0; for (i = 0; i < len; i++) { std::cout << arr_f[i] << " "; } std::cout << std::endl; std::cout << "max sub sum arr: " << get_max_sub_mul(arr_f, len) << std::endl; return 0; }
相关文章推荐
- java中数组的最大长度以及List的最大容量
- 编程之美系列之求子数组的最大乘积
- 子数组的最大乘积——编程之美2.13
- 求连续子数组最大乘积
- Array-----152. Maximum Product Subarray(最大连续子数组乘积)
- js中的冒泡排序以及实现一个数组中得最到最大的数字小例
- 【开放 5月18日 发布】:子数组的最大乘积问题_____问题简单,请思考如何逐步降低时间复杂度,跟帖回复,群内讨论.
- 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值
- 【编程之美】2.13 子数组的最大乘积
- 628. Maximum Product of Three Numbers数组中三个数乘积最大
- 子数组最大乘积
- 连续子数组的和的最大值、最小值以及和的绝对值的最大值、最小值
- 编程之美_子数组的最大乘积
- 获取数组中子串乘积的最大值
- Java有N个数字的int类型数组,如何获取数量最多并且数字最大的数以及数量
- 子数组的最大乘积
- 经典算法——连续子数组的最大乘积
- 笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
- 编程之美--求数组的子数组的最大乘积
- 2.13子数组最大乘积