公式
D - 登山と休憩 / Hiking and Rest 解説
by
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)
投稿日時:
最終更新:
