https://www.acmicpc.net/problem/11052


문제

강남역에서 붕어빵 장사를 하고 있는 해빈이는 지금 붕어빵이 N개 남았다.

붕어빵 i개로 이루어진 세트 메뉴의 가격은 Pi 원이다.

세트 메뉴의 가격이 주어졌을 때, 해빈이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.



풀이

 1) 문제를 한글로 풀어본다.


 D(N) = N개의 붕어빵 팔아 얻은 최대 수익



 2) 점화식을 만든다.


 D(N) = Max(D[N], D[N-i] + P[i])



 3) 코딩

/**
* 붕어빵 판매하기

*
* 문제
* 강남역에서 붕어빵 장사를 하고 있는 해빈이는 지금 붕어빵이 N개 남았다.
*
* 해빈이는 적절히 붕어빵 세트 메뉴를 구성해서 붕어빵을 팔아서 얻을 수 있는 수익을 최대로 만드려고 한다. 붕어빵 세트 메뉴는 붕어빵을 묶어서 파는 것을 의미하고, 세트 메뉴의 가격은 이미 정해져 있다.
*
* 붕어빵 i개로 이루어진 세트 메뉴의 가격은 Pi 원이다.
*
* 붕어빵이 4개 남아 있고, 1개 팔 때의 가격이 1, 2개는 5, 3개는 6, 4개는 7인 경우에 해빈이가 얻을 수 있는 최대 수익은 10원이다. 2개, 2개로 붕어빵을 팔면 되기 때문이다.
*
* 1개 팔 때의 가격이 5, 2개는 2, 3개는 8, 4개는 10 인 경우에는 20이 된다. 1개, 1개, 1개, 1개로 붕어빵을 팔면 되기 때문이다.
*
* 마지막으로, 1개 팔 때의 가격이 3, 2개는 5, 3개는 15, 4개는 16인 경우에는 정답은 18이다. 붕어빵을 3개, 1개로 팔면 되기 때문이다.
*
* 세트 메뉴의 가격이 주어졌을 때, 해빈이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.
*
* 입력
* 첫째 줄에 해빈이가 가지고 있는 붕어빵의 개수 N이 주어진다. (1 ≤ N ≤ 1,000)
*
* 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
*
* 출력
* 해빈이가 얻을 수 있는 최대 수익을 출력한다.
*
* 예제 입력 1
* 4
* 1 5 6 7
* 예제 출력 1
* 10
* 예제 입력 2
* 5
* 10 9 8 7 6
* 예제 출력 2
* 50
* 예제 입력 3
* 10
* 1 1 2 3 5 8 13 21 34 55
* 예제 출력 3
* 55
* 예제 입력 4
* 10
* 5 10 11 12 13 30 35 40 45 47
* 예제 출력 4
* 50
* 예제 입력 5
* 4
* 5 2 8 10
* 예제 출력 5
* 20
* 예제 입력 6
* 4
* 3 5 15 16
* 예제 출력 6
* 18
*/

import java.io.*;
import java.util.*;

public class BOJ_11052_붕어빵 {

public static void main(String[] args) throws IOException {


int result = go();


System.out.println(result);

}

private static int go() throws IOException {
// 붕어빵 개수 입력 받음.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());

int[] p = new int[n+1];

StringTokenizer st = new StringTokenizer(in.readLine(), " ");

// 세트 메뉴 가격 입력 받음.
for (int i = 1; i <= n; i++) {
p[i] = Integer.parseInt(st.nextToken());
}

int[] d = new int[n+1];

d[1] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
d[i] = Math.max(d[i], d[i-j] + p[j]);
}
}

return d[n];
}
}


'ALGORITHM > DP' 카테고리의 다른 글

10844번 - 쉬운 계단 수  (0) 2018.07.23
11727번 - 2×n 타일링 2  (0) 2018.07.21
11726번 - 2×n 타일링  (0) 2018.07.21
1463 - 1로 만들기 성공  (0) 2018.07.20

https://www.acmicpc.net/problem/11727


문제

2×n 크기의 직사각형을 1×2, 2×1, 2x2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.



풀이

 1) 문제를 한글로 풀어본다.


   D(N) = 2xN 직사각형을 채우는 방법의 수



 2) 점화식을 만든다.


 D(N) = D[N-1] + (D[N-2] x 2)


 3) 코딩

/**
* 2×n 타일링 2
*
* 문제
* 2×n 직사각형을 1x2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
*
* 입력
* 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
*
* 출력
* 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
*
*
* 예제 입력 1
* 2
* 예제 출력 1
* 3
* 예제 입력 2
* 8
* 예제 출력 2
* 171
* 예제 입력 3
* 12
* 예제 출력 3
* 2731
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class BOJ_11727_2xn_타일링2 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());
int[] d = new int[1001];

d[1] = 1;
d[2] = 3;
for (int i = 3; i <= n; i++) {
d[i] = (d[i-1] + (d[i-2]*2)) % 10007;
}

System.out.println(d[n]);
}
}


'ALGORITHM > DP' 카테고리의 다른 글

10844번 - 쉬운 계단 수  (0) 2018.07.23
11052번 - 붕어빵 판매하기  (0) 2018.07.21
11726번 - 2×n 타일링  (0) 2018.07.21
1463 - 1로 만들기 성공  (0) 2018.07.20

https://www.acmicpc.net/problem/11726


문제

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.



풀이

 1) 문제를 한글로 풀어본다.


   D(N) = 2xN 직사각형을 채우는 방법의 수



 2) 점화식을 만든다.


 D(N) = D[N-1] + D[N-2]


 3) 코딩

/**
* 문제
* 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
*
* 입력
* 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
*
* 출력
* 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
*
* 예제 입력 1
* 2
* 예제 출력 1
* 2
* 예제 입력 2
* 9
* 예제 출력 2
* 55
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ_11726_2xn_타일링 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());

int[] d = new int[1001];
d[1] = 1;
d[2] = 2;
for (int i = 3; i <= n; i++) {
d[i] = (d[i-1] + d[i-2]) % 10007;
}
System.out.println(d[n]);
}
}


'ALGORITHM > DP' 카테고리의 다른 글

10844번 - 쉬운 계단 수  (0) 2018.07.23
11052번 - 붕어빵 판매하기  (0) 2018.07.21
11727번 - 2×n 타일링 2  (0) 2018.07.21
1463 - 1로 만들기 성공  (0) 2018.07.20

+ Recent posts