競技プログラミング日記

主に AtCoder の記事です

アルゴリズムと数学094 - Maximal Value

アルゴリズムと数学094 - Maximal Value

解法

\(a_{i}\)の和の最大を求める. まず,各\(i \in N\) に対して \(a_{i}\) の最大を見積もる. \(b_{i} \geq max(a_{i}, a_{i+1}) \geq a_{i}\) かつ \(b_{i-1} \geq max(a_{i-1}, a_{i}) \geq a_{i}\) であるから, \(min(b_{i}, b_{i-1}) \geq a_{i}\). ただし,\(b_{-1} = b_{n-1} = \infty\)とする.
逆に,各 \(i \in N\) に対して \(a_{i} := min(b_{i-1}, b_{i})\) とおけば,\(b\) に関する条件を満たす.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n;
  cin >> n;
  vll b(n-1); cinv(b);

  ll ans = 0;
  ans += b.front();
  ans += b.back();
  rep(i,n-2){
    ans += min(b[i], b[i+1]);
  }
  cout << ans << endl;

  return 0;
}