数组中取出下标不连续的任意个数,求取出的数的和的最大值

来源:互联网 发布:知我药妆是真的吗 编辑:程序博客网 时间:2024/05/20 13:13
    给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组A[]={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。现再给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。    解析:典型的动态规划思想,设置一个辅助数组,大小和原数组的大小一样,辅助数组中值表示从原数组起始位置开始到当前下标位置截止的和最大值。比如说我们要求数组{3,9,7,5,1,3,1,2,7},辅助数组元素的值为{3,9,10,14,14,17,17,19,24}。我们如何求得辅助数组?我们假设原数组为arr,辅助数组为data,首先设置辅助数组中data[0] = arr[0],data[1] = arr[1],假设我们当前要求的是data[i],我们已经求得i-1之前不连续任意个数的和的最大值了,我们用arr[i]和data数组中前i-2个数依次相加,如果大于当前最大值,则更新当前最大值,如果小于则继续遍历。直到遍历到第i-2个位置为止。代码如下:
#include<iostream>#include<vector>using namespace std;int getMaxValue(vector<int> &arr){if (arr.empty())return 0;vector<int> data(arr.size());data[0] = arr[0];//设置辅助数组data[0]的初始值data[1] = arr[1];//设置辅助数组data[1]的初始值int curMaxVal = data[0];//当前位置的最大值if (data[1] > data[0])curMaxVal = data[1];//从第三个元素开始遍历数组for (int i = 2; i < arr.size(); ++i){int val = arr[i];for (int j = 0; j < i - 1; ++j){//当前值和之前的值相加与当前最大值相比较if (val + data[j] > curMaxVal){curMaxVal = val + data[j];}}data[i] = curMaxVal;}return curMaxVal;//返回最大值}int main(void){vector<int> arr1 = { 1, 2, 2, 5, 3, 4, 3 };cout <<"数组arr1中不连续下标的任意个数的和的最大值:"<< getMaxValue(arr1) << endl;vector<int> arr2 = { 3, 9, 7, 5, 1, 3, 1, 2, 7 };cout << "数组arr2中不连续下标的任意个数的和的最大值:"<<getMaxValue(arr2) << endl;system("pause");return 0;}
0 0
原创粉丝点击