[Algorithm] 🍷白駿2156ワインを味わう


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、従来のワインX
    dp[i-2]+p[i]
    3)現在のワインO、以前のワインO
    dp[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.結果



    成功~