-
[Algorithms] 백준 DP 문제모음 (Top-down 유형)Computer Basis/Algorithms 2021. 10. 30. 16:55
# 포도주 시식 (2156번)
1. Top-down 유형에 익숙해지자...
2. 항상 기본적인 예외 체크를 신경쓰자...!!! (n이 최소,최대 일 때)
import java.util.Scanner; public class Main { static int[] drink; static int[] podoJu; //drink(n) : n(마지막) 잔을 마셨을 때 최대로 마시는 양 //case 1 : drink(n) = pick(n-1)+pick(n)+drink(n-3) //n-1 //case 2 : drink(n) = pick(n)+drink(n-2) //n-2 //case 3 : drink(n) = pick(n)+drink(n-3, n-4, ..) //vast jump //case 3 never happen dude.....;;; //case 4 : drink(n) = pick(n-1)+pick(n)+ drink(n-3,n-4, ...) // for case 3, previousMax : max between drink(0) to drink(n-3) public static void makeDrink(int size,int previousMax){ for(int n=3; n<size; n++){ previousMax = maxUpdate(drink[n-3],previousMax); drink[n]= Math.max( pick(n-1)+pick(n)+previousMax, pick(n)+drink[n-2]); }//end for } public static int pick(int n){ return podoJu[n]; } public static void printArr(int size){ for(int i=0;i<size;i++){ System.out.print(drink[i]+" "); } System.out.println(); } public static void printPodoArr(int size){ for(int i=0;i<size;i++){ System.out.printf("%3d ",podoJu[i]); } System.out.println(); } public static int maxUpdate(int now, int previousMax){ return Math.max(now,previousMax); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n= sc.nextInt(); podoJu= new int[n+1]; drink = new int[n+1]; for(int i=0;i<n;i++){ podoJu[i] = sc.nextInt(); } int max = 0; drink[0]=pick(0); max = maxUpdate(drink[0],max); if(n>1){ drink[1]=pick(0)+pick(1); if(n>2){ drink[2]=Math.max(pick(2)+pick(0), pick(2)+pick(1)); } } makeDrink(n,max); // printPodoArr(n); // printArr(n); if(n>1){ System.out.println(Math.max(drink[n-1],drink[n-2])); }else{ System.out.println(drink[n-1]); } /* examples * 6 6 10 13 9 8 1 * 6 300 400 2 1 4 200 * 8 300 400 3 1 2 1 4 200 * */ } } /* 다른사람 로직 (D는 dp 배열, W는 podoJu) // D[i-2] : n-2 번째 pick 했을때의 최대양 // D[i-3] : n-3 번째 pick 했을때의 최대양 + podoJu[n-1] pick // D[i]+W[i] : 위의 두가지 케이스중 큰거 + podoJu[n] pick // D[i-1] : podoJu[n] pick 안했을때의 최대양 (=n-1 번째 pick 했을때의 최대양) // 즉, D[i] : n번째 pick 했을때 or 안했을때의 최대양...? for (int i = 3; i <= N; i++) { D[i] = max(D[i - 2], D[i - 3] + W[i - 1]); D[i] = max(D[i] + W[i], D[i - 1]); } */
# 계단 오르기 (2579번)
1. 쉽다! 헿ㅎㅎㅎ
import java.util.Scanner; public class Main{ //1. 연속3개 ㄴㄴ //2. jump는 1~2 //3. last one should be stepped on ==> Top-down // max point calculate //0< stair's point <=10000 //0< num of stairs <=300 public static int[] stairs; public static int[] dp; //dp[n] : n번째 계단을 밟았을때 포인트 총합 최대값 //case1 : stairs[n-1]+dp[n-3] //case2 : stairs[n-2]+stairs[n-3]+dp[n-5] (n-4는 밟으면안됨...) //case3 : stairs[n-2]+dp[n-4] //case2 & case 3 : dp[n-2] public static void gameStart(int size){ for(int n=3;n<=size;n++){ dp[n]= Math.max( dp[n-3]+stairs[n-1],dp[n-2]) + stairs[n]; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); stairs= new int[n+1]; dp= new int[n+1]; for(int i=1; i<=n; i++){ stairs[i]=sc.nextInt(); } //Minimum Exception handling if(n<3){ dp[1]=stairs[1]; if(n==2){ dp[2]=stairs[1]+stairs[2]; } System.out.println(dp[n]); } //Main logic else{ dp[1]=stairs[1]; dp[2]=stairs[1]+stairs[2]; gameStart(n); System.out.println(dp[n]); } } }
728x90'Computer Basis > Algorithms' 카테고리의 다른 글
[Algorithms] 정렬 알고리즘의 종류와 시간복잡도, 사용처 (+ Java 구현코드) (0) 2021.11.08 [Algorithms] 백준 DP 문제모음 (bottom-up 유형) (0) 2021.11.01 행렬연산을 위한 자료구조, Tensor, Torch 를 자바로 재구현 해보자! (0) 2021.10.14