[Algorithm] 🍷白駿2156ワインを味わう
9409 ワード
0、問題
孝珠はワインの試飲会に行きました.そこへ行くと、テーブルの上にいろいろなワインが盛られたグラスが並んでいました.孝珠はワインを味わいます.ここには2つのルールがあります.
1.ワイングラスを選んだ後、グラスのワインを全部飲んで、飲んだ後、元の場所に戻します.
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以下の音ではなく整数です.
しゅつりょく
最初の行で飲める最大のブドウ酒の量を出力します.
1.アイデア
合計3種類の計算
1)現在のワインX
2)現在のワインO、従来のワインX
3)現在のワインO、以前のワインO
2.コア解答
1)現在のワインX
dp[i-1]
2)現在のワインO、従来のワインXdp[i-2]+p[i]
3)現在のワインO、以前のワインOdp[i-3] + p[i] + p[i-2]
3.コード
import java.util.Scanner;
public class DP_3 {
static int p[];
static int dp[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
p = new int[n+10];
dp = new int[n+10];
for(int i=1; i<=n; i++)
p[i] = sc.nextInt();
dp[1] = p[1];
dp[2] = p[1]+p[2];
System.out.println(maxWine(n));
}
static int maxWine(int n) {
for(int i=3; i<=n; i++) {
int ret = 0;
ret = Math.max(p[i]+dp[i-2], dp[i-1]);
ret = Math.max(ret, dp[i-3]+p[i-1]+p[i]);
dp[i] = ret;
}
return dp[n];
}
}
4.結果
成功~
Reference
この問題について([Algorithm] 🍷白駿2156ワインを味わう), 我々は、より多くの情報をここで見つけました https://velog.io/@kha0318/Algorithm-백준-2156-포도주-시식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol