公式

D - 登山と休憩 / Hiking and Rest 解説 by kyopro_friends


この問題はDPにより解くことができます。

ある区間まで終えた時点で、ロープウェイを使った回数が同じなら、その時点で標高が低い方が最終的な標高も低くなります。よって、\(\mathrm{dp}[c][i]\) を「\(i\) 番目の区間が終わった時点でロープウェイを \(c\) 回使っているときの標高の最小値」とするDPでこの問題を解くことができます。

実装上は DP を配列で持つ必要はなく、「ロープウェイを使わないときの高さの最小値」「ロープウェイを既に使ったときの高さの最小値」の2つの変数を保持しながら前から順にシミュレーションすればよいです。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
  int n;
  cin >> n;
  vector<int> d(n);
  for(int i=0; i<n; i++) cin >> d[i];

  long long ans0 = 0;  // ロープウェイを使わないときの最小値
  long long ans1 = 0;  // ロープウェイを使うときの最小値
  for(int i=0; i<n; i++){
    ans0 = max(ans0 + d[i], 0LL);
    ans1 = min(max(ans1 + d[i], 0LL), ans0 / 2);
  }
  cout << ans1 << endl;
}

実装例 (Python)

N = int(input())
D = list(map(int, input().split()))

ans0 = 0  # ロープウェイを使わないときの最小値
ans1 = 0  # ロープウェイを使ったときの最小値
for d in D:
  ans0 = max(ans0 + d, 0)
  ans1 = min(max(ans1 + d, 0), ans0 // 2)
print(ans1)

投稿日時:
最終更新: