Skip to content

Commit

Permalink
Update 037.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed May 1, 2022
1 parent 499a3f6 commit c8c8fb4
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion 037.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,36 +119,49 @@ int main()

for (int i = 1; i <= N; ++i) // i 個目の料理を見る
{
// 現在の料理を作らなかった場合の状態(直前の料理と同じ)を設定
dp[i] = dp[i - 1];

// 見ている料理
const auto& dish = dishes[i - 1];

// k: 香辛料の合計量
for (int k = 0; k <= W; ++k)
{
// 現在の料理で [香辛料の合計量] k を実現するために必要な,
// 直前の料理における [香辛料の合計量] の最小値
const int fromBegin = std::max(0, (k - dish.R));

// 現在の料理で [香辛料の合計量] k を実現するために必要な,
// 直前の料理における [香辛料の合計量] の最大値(の次の要素を指して, 範囲の終端位置を表現)
const int fromEnd = std::max(0, (k - dish.L + 1));

// [fromBegin, fromEnd) で範囲を表す. (fromBegin == fromEnd) の場合は, 実現不可能
if (fromBegin == fromEnd)
{
continue;
}

// セグメント木による区間最大値取得.
// [fromBegin, fromEnd) の中で最大の価値合計値を探す
const long long max = rmqs[i - 1].query(fromBegin, fromEnd);

// 最大の価値合計値 -1 は, 直前の状態が実現不可能ということなのでスキップ
if (max != -1)
{
// 料理を作らない場合と作る場合の価値合計値を比較して, 大きいほうを採用
dp[i][k] = std::max(dp[i][k], (max + dish.V));
}
}

// セグメント木を更新
for (int k = 0; k <= W; ++k)
{
rmqs[i].update(k, dp[i][k]);
}
}

// 解答を出力
// 解答 (dp[N][W]) を出力
std::cout << dp.back().back() << '\n';
}
```
Expand Down

0 comments on commit c8c8fb4

Please sign in to comment.