Cycle DP. 最初を固定して考えて,1周してきたときに辻褄があっている物を採用する.
実装:
\(-1 \,(mod N)\) 番目を固定した上で, \(for i \in N\) をループする. \(i = N-1\) のときに,最初に固定したものと一致するものを採用する.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
ll n; cin >> n;
vll a(n); rep(i,n) { cin >> a[i]; }
ll ans = INFL;
rep(s, 2){
// s = 0 : x
// s = 1 : o
vll dp(2, INFL);
dp[s] = 0;
rep(i,n) {
vll p(2, INFL);
swap(p, dp);
rep(t, 2){
if(t == 0){
chmin(dp[1], p[t] + a[i]);
}else{
chmin(dp[0], p[t]);
chmin(dp[1], p[t] + a[i]);
}
}
}
chmin(ans, dp[s]);
}
cout << ans << endl;
return 0;
}