1+ class Solution {
2+ public:
3+ long long NEG=-100000000000000L ;
4+ long long solve (int ind, int state, int n, vector<int > &nums,vector<vector<long long >> &dp){
5+ if (ind==n){
6+ return state==3 ?0 :NEG;
7+ }
8+ if (dp[ind][state]!=-1LL ){
9+ return dp[ind][state];
10+ }
11+ long long take=NEG,notTake=NEG;
12+ if (state==0 ){
13+ notTake=solve (ind+1 ,0 ,n,nums,dp);
14+ }
15+ if (state==3 ){
16+ take=nums[ind];
17+ }
18+ if (ind+1 <n){
19+ if (state==0 && nums[ind+1 ]>nums[ind]){
20+ take=max (take,nums[ind]+solve (ind+1 ,1 ,n,nums,dp));
21+ }
22+ else if (state==1 ){
23+ if (nums[ind+1 ]>nums[ind]){
24+ take=max (take,nums[ind]+solve (ind+1 ,1 ,n,nums,dp));
25+ }
26+ else if (nums[ind+1 ]<nums[ind]){
27+ take=max (take,nums[ind]+solve (ind+1 ,2 ,n,nums,dp));
28+ }
29+ }
30+ else if (state==2 ){
31+ if (nums[ind+1 ]<nums[ind]){
32+ take=max (take,nums[ind]+solve (ind+1 ,2 ,n,nums,dp));
33+ }
34+ else if (nums[ind+1 ]>nums[ind]){
35+ take=max (take,nums[ind]+solve (ind+1 ,3 ,n,nums,dp));
36+ }
37+ }
38+ else if (state==3 && nums[ind+1 ]>nums[ind]){
39+ take=max (take,nums[ind]+solve (ind+1 ,3 ,n,nums,dp));
40+ }
41+ }
42+ return dp[ind][state]=max (take,notTake);
43+ }
44+
45+ long long maxSumTrionic (vector<int >& nums) {
46+ int n=nums.size ();
47+ vector<vector<long long >> dp (n,vector<long long >(4 ,-1 ));
48+ return solve (0 ,0 ,n,nums,dp);
49+ }
50+ };
0 commit comments