1+ #pragma GCC optimize("Ofast")
2+ #pragma GCC optimize("unroll-loops")
3+ #include < bits/stdc++.h>
4+ using namespace std ;
5+ typedef long long ll;
6+
7+ int n;
8+ vector<ll> to_add;
9+ vector<pair<ll, ll>> factor;
10+ vector<vector<ll>> memo;
11+ ll dp (ll idx, int side) {
12+ if (idx == n) return 1 ;
13+ if (memo[idx][side] != -1 ) return memo[idx][side];
14+
15+ if (side == 0 ) {
16+ return memo[idx][side] = dp (idx + 1 , 0 ) + max (dp (idx + 1 , 0 ), dp (idx + 1 , 1 )) * (factor[idx].first - 1 );
17+ } else {
18+ return memo[idx][side] = dp (idx + 1 , 1 ) + max (dp (idx + 1 , 1 ), dp (idx + 1 , 0 )) * (factor[idx].second - 1 );
19+ }
20+ }
21+
22+ int main () {
23+ int tc;
24+ cin >> tc;
25+ while (tc--) {
26+ cin >> n;
27+ to_add.assign (n, 0 );
28+ factor.assign (n, {0 , 0 });
29+
30+ for (int i = 0 ; i < n; i++) {
31+ char left_op, right_op;
32+ ll left_num, right_num;
33+
34+ cin >> left_op >> left_num >> right_op >> right_num;
35+
36+ if (left_op == ' +' ) {
37+ factor[i].first = 1 ;
38+ to_add[i] += left_num;
39+ } else {
40+ factor[i].first = left_num;
41+ }
42+
43+ if (right_op == ' +' ) {
44+ factor[i].second = 1 ;
45+ to_add[i] += right_num;
46+ } else {
47+ factor[i].second = right_num;
48+ }
49+ }
50+
51+ memo.assign (n, vector<ll>(2 , -1 ));
52+
53+ ll onLeft = 1 ;
54+ ll onRight = 1 ;
55+ for (int i = 0 ; i < n; i++) {
56+ ll additional = to_add[i] + (factor[i].first - 1 ) * onLeft + (factor[i].second - 1 ) * onRight;
57+ if (dp (i + 1 , 0 ) > dp (i + 1 , 1 )) {
58+ // better value to add to the left
59+ onLeft += additional;
60+ } else {
61+ // better value to add to the right
62+ onRight += additional;
63+ }
64+ }
65+
66+ cout << onLeft + onRight << endl;
67+ }
68+
69+ return 0 ;
70+ }
0 commit comments