给一个整数数组,有正有负。找出数组最大和,条件是使用的元素不能有相邻
来源:互联网 发布:python课程推荐 编辑:程序博客网 时间:2024/06/05 02:32
题目:给一个整数数组,有正有负。找出数组最大和,条件是使用的元素不能有相邻
输出:
1)打印最大和
2)打印组成最大和的元素,用空格分隔
如果所有元素都是负数,最大和为最大的负数,要求时间复杂度为O(n)
例:
输入数组:
-1,4,5,-2,-6,6
输出:
11
5 6
输出:
1)打印最大和
2)打印组成最大和的元素,用空格分隔
如果所有元素都是负数,最大和为最大的负数,要求时间复杂度为O(n)
例:
输入数组:
-1,4,5,-2,-6,6
输出:
11
5 6
#include <iostream>#include <vector>#include <algorithm>#include <limits>using namespace std;void MaxSum(vector<int> &vec){/************************************************************************//* dp[i][j](i=1~n, j=0~1)表示取1~i这些数的最优解,其中j=0表示最后一个数不取,j=1表示最后一个数取。dp[i][0] = max(dp[i-1][0], dp[i-1][1])dp[i][1] = a[i] + dp[i-1][0]显然这个dp是线性的。要输出解只要把状态转移的决策记录下来,追溯一下就行。 *//************************************************************************/vector<vector<int> > dp;vector<int> b0;//记录前一个元素不取的解vector<int> b1;//记录前一个元素取的解vector<int> c0;;//记录当前一个元素不取的解vector<int> c1;//记录当前一个元素取的解vector<int> tmp;int len=vec.size();for (int i=0;i<=len;++i){tmp.clear();tmp.push_back(0);tmp.push_back(0);dp.push_back(tmp);}//初始化状态dp[0][0]=0;dp[0][1]=INT_MIN;int maxE=INT_MIN;//记录数组的最大值,如果最大值小于0,则直接输出最大值for (int i=0;i<len;++i){dp[i+1][0]=max(dp[i][0],dp[i][1]);//当前元素不取dp[i+1][1]=vec[i]+dp[i][0];//当前元素取,那么前一个元素必定不取if (vec[i]>maxE){maxE=vec[i];}if (dp[i][0]<dp[i][1]){c0=b1;}elsec0=b0;c1=b0;c1.push_back(vec[i]);b0=c0;b1=c1;}if (maxE>0){cout<<max(dp[len][0],dp[len][1])<<endl;if (dp[len][0]<dp[len][1]){//c1for (int i=0;i<c1.size();++i){cout<<c1[i]<<' ';}}else{//c0for (int i=0;i<c0.size();++i){cout<<c0[i]<<' ';}}cout<<endl;}else{//数组全部为负数cout<<maxE<<endl;cout<<maxE<<endl;}}int main(){int n;cin>>n;int tmp;vector<int> vec;for (int i=0;i<n;++i){cin>>tmp;vec.push_back(tmp);}MaxSum(vec);return 0;}
0 0
- 给一个整数数组,有正有负。找出数组最大和,条件是使用的元素不能有相邻
- 找出MXN数组中所有不相邻元素,并求出它们的和(相邻的数:前一个数是偶数,后一个数是素数)
- 找出数组中任何相邻子向量的最大和
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 求一个数组中最大的相邻元素之和
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 数组中不相邻元素的最大和
- 元素互不相邻的最大和子数组
- 给定一个非负数组,求不相邻元素的最大和。
- 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置。
- leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组
- 一个包含正整数和负整数的数组,找出和最大的子串.
- 数组最大相邻元素之和
- 如果给定一个数组arr[0,...N-1],要求找出相邻两个数的最大差值
- 对于一个有正有负的整数数组,请找出总和最大的连续数列
- 不相邻的最大子数组和
- 有一个3行4列的二维数组,要求编程找出最大的元素,并输出所在的行和列。
- 找出一个数组里边和最大的子数组,输出最大和和子数组
- CentOS 6.5系统中如何安装MySQL 5.6.10数据库和修改root密码
- 菜鸟译文(一)——Java中的继承和组合
- HLS入门收集(1)
- Linux 下编译安装 PHP 5.5
- discuz入门小结
- 给一个整数数组,有正有负。找出数组最大和,条件是使用的元素不能有相邻
- C++中namespace的使用
- 【bsgs】hdu4887
- linux下安装eclipse
- js控制图片缩放、水平和垂直方向居中对齐
- ACdream-1056 Bad Horse
- C# .Net练习代码 Employee Class
- 【1】The connection to adb is down, and a severe error has occured(Android模拟器端口被占用)
- 南阳 223 小明的烦恼