1. Recursive Inclusion / Exclusion
Intuition
Recursively check all subsequences, maintaining the last chosen element, and sum elements if strictly increasing.
Algorithm
- Define
solve(idx, prevIdx). - If
idx == n, return 0. - Exclude
arr[idx]:solve(idx + 1, prevIdx). - Include
arr[idx]: ifprevIdx == -1 || arr[idx] > arr[prevIdx], computearr[idx] + solve(idx + 1, idx). - Return
max(exclude, include).
#include <iostream>#include <vector>#include <algorithm> using namespace std; class Solution { int solve(int idx, int prevIdx, const vector<int>& arr) { if (idx == arr.size()) return 0; int notTake = solve(idx + 1, prevIdx, arr); int take = 0; if (prevIdx == -1 || arr[idx] > arr[prevIdx]) { take = arr[idx] + solve(idx + 1, idx, arr); } return max(notTake, take); }public: int maxSumIS(vector<int>& arr) { return solve(0, -1, arr); }}; int main() { Solution sol; vector<int> arr = {1, 101, 2, 3, 100, 4, 5}; cout << "Max Sum IS: " << sol.maxSumIS(arr) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) recursion stack