競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 251E

ABC251E

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;
}