T1
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int n, f[N];
bool a[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 0; i <= n + 2; ++i) f[i] = n + 1;
f[0] = 0;
for (int i = 0; i <= n; ++i) {
f[i + 2] = min(f[i + 2], f[i] + a[i + 1]);
f[i + 3] = min(f[i + 3], f[i] + a[i + 1]);
f[i + 4] = min(f[i + 4], f[i] + a[i + 1] + a[i + 2]);
}
cout << min({f[n], f[n + 1]});
return 0;
}
T3
#include <iostream>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
const int N = 410, M = 4e5, inf = 1e9;
int n, F[M * 2], G[M * 2], ans;
pair<int, int> a[N];
int *f = &F[M], *g = &G[M];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i].first >> a[i].second;
sort(a + 1, a + n + 1, [&] (pii &x, pii &y) { return abs(x.first) < abs(y.first); });
int L = 0, R = 0;
for (int i = 1; i <= n; ++i) {
for (int j = L - a[i].first; j < L; ++j) f[j] = -inf;
for (int j = R + 1; j <= R + a[i].first; ++j) f[j] = -inf;
for (int j = L; j <= R; ++j) g[j] = f[j];
for (int j = L; j <= R; ++j) f[j + a[i].first] = max(f[j + a[i].first], g[j] + a[i].second);
L += min(0, a[i].first), R += max(0, a[i].first);
}
for (int i = 0; i <= R; ++i) if (f[i] >= 0) ans = max(ans, i + f[i]);
cout << ans << '\n';
return 0;
}
T4
#include <iostream>
#include <algorithm>
using namespace std;
using i64 = long long;
const int N = 1010, mod = 998244353;
int n, a[N];
i64 f[N][N][2];
int q_pow(int x, int y) {
if (x == 0 && y == 0) return 0;
int res = 1;
for (; y; y >>= 1, x = 1ll * x * x % mod)
if (y & 1) res = 1ll * res * x % mod;
return res;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j)
f[i][j][0] = f[i][j][1] = 0;
for (int l = n; l >= 1; --l) {
for (int r = l; r <= n; ++r) {
if (l != 1) {
f[l - 1][r][0] = max(f[l - 1][r][0], f[l][r][0] + q_pow(a[l - 1], a[l]));
f[l - 1][r][0] = max(f[l - 1][r][0], f[l][r][1] + q_pow(a[l - 1], a[r]));
}
if (r != n) {
f[l][r + 1][1] = max(f[l][r + 1][1], f[l][r][0] + q_pow(a[r + 1], a[l]));
f[l][r + 1][1] = max(f[l][r + 1][1], f[l][r][1] + q_pow(a[r + 1], a[r]));
}
}
}
cout << max(f[1][n][0], f[1][n][1]) << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T; cin >> T; while (T--) solve();
return 0;
}
T5
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 100;
int n, a[N][3], f[N][3][3], ans;
bool ok(int x, int y, int z) {
if (x == y || y == z) return 0;
if ((y & 1) && x != z) return 0;
return 1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i][0] >> a[i][1] >> a[i][2];
for (int x = 0; x <= 2; ++x)
for (int y = 0; y <= 2; ++y) if (x != y) {
memset(f, -0x3f, sizeof f);
f[2][y][x] = a[1][x] + a[2][y];
for (int i = 3; i <= n; ++i) for (int j = 0; j <= 2; ++j)
for (int p = 0; p <= 2; ++p) for (int q = 0; q <= 2; ++q)
if (ok(q, p, j)) f[i][j][p] = max(f[i][j][p], f[i - 1][p][q] + a[i][j]);
for (int p = 0; p <= 2; ++p) for (int q = 0; q <= 2; ++q)
if (ok(q, p, x) && ok(p, x, y)) ans = max(ans, f[n][p][q]);
}
cout << ans << '\n';
return 0;
}