网易实习生算法组编程题二:求数组的两个子数组和的最大值
2017-03-27 10:36
267 查看
求一个正整数数组的两个子数组,使其和相等,找出满足这样要求的子数组和的最大值,若不存在,则返回-1。比如【1,1,2,3,5,20】,结果为6。
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; const int maxn = 500010; int n; vector<int> a; int dp[2][maxn]; int solve(vector<int> v) { int res = 0; memset(dp, 0, sizeof(dp)); int p = 0; for (int i = 0; i < v.size(); i++) { //for each loop, dp[p][ix] stores the large sum of two subarray where the substract is equal to ix dp[p][v[i]] = max(dp[1 - p][v[i]], v[i]); for (int ix = 0; ix < maxn; ix++) { if (dp[1 - p][ix]) {//zero means that for "ix",there is no two subarray. // do not use the v[i] element if (dp[p][ix] < dp[1 - p][ix]) dp[p][ix] = dp[1 - p][ix]; //put the v[i] element to the bigger subArray dp[p][ix + v[i]] = max(dp[p][ix + v[i]], max(dp[1 - p][ix + v[i]], dp[1 - p][ix] + v[i])); //put the v[i] element to the smaller subArray dp[p][abs(ix - v[i])] = max(dp[p][abs(ix - v[i])], max(dp[1 - p][abs(ix - v[i])], max(dp[1 - p][ix] - ix + v[i], dp[1 - p][ix]))); } } p = 1 - p; } if (dp[1 - p][0]) res = dp[1 - p][0]; else res = -1; return res; } int main() { cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; a.push_back(x); } cout << solve(a) << endl; return 0; } a.push_back(x); } cout << solve(a) << endl; return 0; }
相关文章推荐
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 算法题解之网易2018春招编程之最大重叠矩形个数
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 给定一个由非负整数和整数m组成的数组,可以将该数组分成m个非空的连续子数组。 写一个算法来最小化这些m个子阵列之间的最大和。
- 线性算法解决数组最大和
- 数组中子序列最大和算法
- 一个算法题(2)(来源于网易编程挑战赛)
- 子数组的最大乘积; 3种算法,2个代码;
- 数组复习及Scanner类 ,及对最大值,最小值、平均数、求和等基本算法的理解
- [动态规划]最大连续子数组和的四种算法
- 读书笔记之编程之美 - 2.15 子数组之和的最大值(二维)
- 从数组中查找出最大最小两数的log(n)算法
- [算法题] 求数组的子数组之和的最大值
- 算法讨论(二)---求子数组的最大和
- 三种算法求解一个数组的子数组最大和
- 算法-数组:找出符合某条件的最大矩形区域
- C#基础编程---数组最大值最小值
- OpenCV编程案例:最大熵阈值分割算法实现
- 一个无序整数数组,数组元素大于5个,请用一种高效的算法找出其中最大的5个值.
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)