2018-9-27 다이나믹 프로그래밍 문제풀이

DP문제풀이

1,2,3 더하기

  • 정수 n을 1,2,3의 조합으로 나타내는 방법의 수를 구하는 문제
  • x + x + … + x = n; 마지막x에 올 수 있는 수 : 1,2,3중 하나

  • case1 : 마지막 x = 1일때, 이전의 합 : n-1 => D[n-1]
  • case2 : 마지막 x = 2일때, 이전의 합 : n-2 => D[n-2]
  • case3 : 마지막 x = 3일때, 이전의 합 : n-3 => D[n-3]
  • D[n] = D[n-1] + D[n-2] + D[n-3];
import java.util.Scanner;

public class Baekjoon2193 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        long [] arr = new long[num+1];
        arr[1] = 1;
        arr[2] = 1;
        for (int i = 3; i <= num; i++)
            arr[i] = arr[i-1] + arr[i-2];

        System.out.println(arr[num]);
    }
}

붕어빵 판매하기(백준11052)

  • 붕어빵 N개를 가지고 있다. i개를 팔아서 얻을 수 있는 수익이 p[i]일 때, N개를 모두 판매해서 얻을 수 있는 최대 수익구하기
  • 2개를 팔아서 수익이 5원이면, 2개를 팔아서 5원이지, 1개를 팔아서 5원이아니다.
4 // 4개
1 5 6 7 // p[1] = 1, p[2] = 5, p[3] = 6, p[4] = 7

정답은 10 => 2개를 팔면 5원이 되기때문에 2개씩 2번팔면 총 10원이 된다.
5 // 5개를 팔때,
10 9 8 7 6

// 정답은 50, 1개씩 5번팔기
4
3 5 15 16
// 정답 18원
  • D[n] : n개팔아서 얻을 수 있는 수익
  • x + x + x + x … + x = n;
  • 마지막사람한태 붕어빵을 몇개를 팔 수 있는지를 결정한테

  • case1 마지막사람에게 1개를 팔때, 이전사람에게 팔 수 있는 붕어빵 n-1개, 최대수익은 : D[n-1], 한명한테 얻을 수 있는 수익은 : p[1], 총 수익 : D[n-1]+P[1]

  • case2 마지막사람에게 2개를 팔때, 이전사람에게 팔 수 있는 붕어빵 n-2개, 최대수익은 : D[n-2], 한명한테 얻을 수 있는 수익은 : p[2], 총 수익 : D[n-2]+P[2]

  • 일반화 : max(P[i] + P[n-i]); 1<=i<=n;
for (int i=1; i<=n; i++) {
	for (int j=1; j<=i; j++) {
    	d[i] = max(d[i], d[i-j]+a[j]);
    }
}
Written on September 27, 2018