白俊-ワインを味わう(2156)
Dynamic Programming
質問する
孝珠はワインの試飲会に行きました.そこへ行くと、テーブルの上にいろいろなワインが盛られたグラスが並んでいました.孝珠はワインを味わいます.ここには2つのルールがあります.
グラスを一つ選びました.そのワインは全部飲んで、飲んだら元の場所に戻します.
並べ続けた3杯を全部飲み干すわけにはいかない.
できるだけ多くのワインを味わうために、孝珠はどのワイングラスを選ぶべきか悩んでいる.1からn番のn個のブドウの杯は順番にテーブルの上に置いて、各ブドウの杯の中のブドウの酒の量はタイミングをあげて、1つのプログラムを編纂して、あなたが最も多くのワインを飲むことを助けてください.
例えば、6個のブドウグラスがあり、各コップの中に6、10、13、9、8、1の順であれば、1番目、2番目、4番目、5番目のブドウグラスを選択すれば、総ブドウ酒量は最大33に達することができる.
入力
最初の行はブドウのコップの個数nを与えます.(1≦n≦10000)第2列からn+1列まで、ワインカップ中のブドウ酒の量が順次与えられる.ワインの量は1000以下の音ではなく整数です.
しゅつりょく
最初の行で飲める最大のブドウ酒の量を出力します.
import sys
n = int(sys.stdin.readline())
arr = [0] * (n + 3)
for i in range(3, n + 3):
arr[i] = int(sys.stdin.readline())
table = [0 for i in range(len(arr))]
for i in range(3, n + 3):
table[i] = max(table[i - 1], table[i - 2] + arr[i], table[i - 3] + arr[i - 1] + arr[i])
#max안에는 순서대로
# i - 1까지의 최댓값 & i 안마시기
# i - 2까지의 최댓값 & i - 1 안마시기 & i 마시기
# i - 3까지의 최댓값 & i - 1 마시기 & i 마시기
# table의 각 원소는 해당 인덱스까지 와인을 마셨을 때 최댓값 넣기
print(table[len(table) - 1])
maxを求めるときに増加する値がtableになり、arrの基準は飲むものをarrで処理し、飲まないものの前の計算は最値を考慮するのでtable値を増加します.参照)
https://in0-pro.tistory.com/26
https://pacific-ocean.tistory.com/152
Reference
この問題について(白俊-ワインを味わう(2156)), 我々は、より多くの情報をここで見つけました https://velog.io/@skkfea07/백준-포도주-시식2156テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol