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


문제

45656이란 수를 보자.

이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. 

(0으로 시작하는 수는 없다.).



풀이

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


 D(N) = 길이가 N인 계단 수의 개수 



 2) 점화식을 만든다.


 D[N][L] = D[N-1][L-1] + D[N-1][L+1]

    • L =    0 :  D[N][L] = D[N - 1][L + 1]

    • L = (1 ~ 8) : D[N][L] = D[N - 1][L - 1] + D[N - 1][L + 1]

    • L =    9 : D[N][L] = D[N - 1][L - 1]



 3) 코딩

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

/**
* 쉬운 계단 수
* https://www.acmicpc.net/problem/10844
*
* 문제
* 45656이란 수를 보자.
* 이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
* 세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
* N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
*
* 입력
* 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
*
* 출력
* 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
*
* 예제 입력 1
* 1
* 예제 출력 1
* 9
* 예제 입력 2
* 2
* 예제 출력 2
* 17
*/
public class BOJ_10844_쉬운계단수 {
static final long MOD = 1000000000;

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

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());

long[][] d = new long[n+1][10];

for (int i = 1; i <= 9; i++) {
d[1][i] = 1;
}

for (int i = 2; i <= n; i++) {
for (int j = 0; j <= 9; j++) {
d[i][j] = 0;
if (j - 1 >= 0) d[i][j] += d[i-1][j-1];
if (j + 1 <= 9) d[i][j] += d[i-1][j+1];
d[i][j] %= MOD;
}
}

long result = 0;
for (int i = 0; i <= 9; i++) {
result += d[n][i];
}

result %= MOD;

System.out.println(result);
}
}


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

11052번 - 붕어빵 판매하기  (0) 2018.07.21
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/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

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


문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최소값을 출력하시오.


풀이

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

  • D(N) = N을 1로 만드는데 필요한 최소 연산 횟수
  • 1번 연산 : D(N/3) + 1      // +1 의미 : 해당 연산을 1회 했으므로, 1을 더함.
  • 2번 연산: D(N/2) + 1
  • 3번 연산: D(N-1) + 1


2) 점화식을 만든다.

  • D(N) = min( 1번 연산, 2번 연산, 3번 연산)


3) 코딩

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

/**
* 문제
* 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
*
* X가 3으로 나누어 떨어지면, 3으로 나눈다.
* X가 2로 나누어 떨어지면, 2로 나눈다.
* 1을 뺀다.
* 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
* 연산을 사용하는 횟수의 최소값을 출력하시오.
*
* 입력
* 첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 자연수 N이 주어진다.
*
* 출력
* 첫째 줄에 연산을 하는 횟수의 최소값을 출력한다.
*
* 예제 입력 1
* 2
* 예제 출력 1
* 1
* 예제 입력 2
* 10
* 예제 출력 2
* 3
* 힌트
* 10의 경우에 10 -> 9 -> 3 -> 1 로 3번 만에 만들 수 있다.
*/
public class BOJ_1463_1로_만들기_성공 {

static int[] dp = new int[1000001];


public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());
int result = 0;

result = makeOne(n);
System.out.println(result);
}

private static int makeOne(int n) {
dp[0] = 0;
dp[1] = 0;

for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + 1;
if (i % 2 == 0) dp[i] = Math.min(dp[i], dp[i/2] + 1);
if (i % 3 == 0) dp[i] = Math.min(dp[i], dp[i/3] + 1);
}

return dp[n];
}
}


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

10844번 - 쉬운 계단 수  (0) 2018.07.23
11052번 - 붕어빵 판매하기  (0) 2018.07.21
11727번 - 2×n 타일링 2  (0) 2018.07.21
11726번 - 2×n 타일링  (0) 2018.07.21

+ Recent posts