最大和递增子序列\n
最大和递增子序列是给定整数列表的一个子序列,其和最大且在子序列中,所有元素按升序排列。
假设有一个数组用于存储最大和递增子序列,其中 L[i] 是最大和递增子序列,它以 array[i] 结尾。
输入和输出
Input:
Sequence of integers. {3, 2, 6, 4, 5, 1}
Output:
Increasing subsequence whose sum is maximum. {3, 4, 5}.算法
maxSumSubSeq(array, n)
输入:数字序列,元素数。
输出:递增子序列的最大和。
Begin define array of arrays named subSeqLen of size n. add arr[0] into the subSeqLen for i in range (1 to n-1), do for j in range (0 to i-1), do if arr[i] > arr[j] and sum of subSeqLen [i] < sum of subSeqLen [j], then subSeqLen[i] := subSeqLen[j] done done add arr[i] into subSeqLen[i] res := subSeqLen[0] for all values of subSeqLen, do if sum of subSeqLen[i] > sum of subSeqLen[res], then res := subSeqLen[i] done print the values of res. End
示例
#include <iostream>
#include <vector>
using namespace std;
int findAllSum(vector<int> arr) { //find sum of all vector elements
int sum = 0;
for(int i = 0; i<arr.size(); i++) {
sum += arr[i];
}
return sum;
}
void maxSumSubSeq(int arr[], int n) {
vector <vector<int> > subSeqLen(n); //max sum increasing subsequence ending with arr[i]
subSeqLen[0].push_back(arr[0]);
for (int i = 1; i < n; i++) { //from index 1 to all
for (int j = 0; j < i; j++) { //for all j, j<i
if ((arr[i] > arr[j]) && (findAllSum(subSeqLen[i]) < findAllSum(subSeqLen[j])))
subSeqLen[i] = subSeqLen[j];
}
subSeqLen[i].push_back(arr[i]); //sub Sequence ends with arr[i]
}
vector<int> res = subSeqLen[0];
for(int i = 0; i<subSeqLen.size(); i++) {
if (findAllSum(subSeqLen[i]) > findAllSum(res))
res = subSeqLen[i];
}
for(int i = 0; i<res.size(); i++)
cout << res[i] << " ";
cout << endl;
}
int main() {
int arr[] = { 3, 2, 6, 4, 5, 1 };
int n = 6;
cout << "The Maximum Sum Subsequence is: ";
maxSumSubSeq(arr, n);
}输出
The Maximum Sum Subsequence is: 3 4 5
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP