알고리즘 (with JAVA)/동적 계획법
장마가 찾아왔다 (난이도: 하)
백_곰
2022. 10. 6. 18:03
( 이 알고리즘은 아래 링크에 이어서 진행됩니다. )
우물을 기어오르는 달팽이 (난이도: 하) (tistory.com)
우물을 기어오르는 달팽이 (난이도: 하)
1. 문제 설명 (1) 깊이가 N미터인 우물의 맨 밑바닥에 달팽이가 있다. (2) 달팽이는 우물의 맨 위까지 기어올라가고 싶어하는데, 달팽이의 움직임은 그 날의 날씨에 좌우된다. (3) 날이 맑으면 하루
kind-coding.tistory.com
1. 문제 설명
(1) 앞의 문제에서는 날이 맑거나 비가 올 확률은 동일하게 50%의 확률을 가졌다.
(2) 그러나 여기서는 비가 올 확률을 50%에서 75%로 올라갔다고 가정한다.
(3) 그렇다면 달팽이가 앞으로 M일 안에 우물 끝까지 올라갈 확률을 찾는 프로그램을 작성하시오.
2. 입출력 조건 및 예제
입력 조건
X
출력 조건
X
입력 예제
4
5 4
5 3
4 2
3 2
출력 예제
0.99609375
0.84375
0.5625
0.9375
3. 제약 조건
X
4. 가정법
X
5. 기저 사례
(1) 지정한 날짜 M까지 도달한 경우
6. 코드
public class CLIMB2 {
private static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
private static StringBuilder sb = new StringBuilder();
private static int N, M;
private static int[][] cache;
public static void main(String[] args) throws IOException {
StringTokenizer st;
int C = Integer.parseInt(sc.readLine());
for(int i=0; i<C; i++) {
cache = new int[101][101];
st = new StringTokenizer(sc.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
sb.append((solve(0, 0))+"\n");
}
System.out.println(sb);
}
private static double solve(int days, int climbed) {
// 기저 사례(1): M일이 모두 지난 경우
if(days==M) return climbed>=N ? 1:0;
// 메모제이션
if(cache[days][climbed] != 0) return cache[days][climbed];
return 0.25*solve(days+1, climbed+1) + 0.75*solve(days+1, climbed+2);
}
}
7. 점화식
- 앞 문제(우물을 기어오르는 달팽이)에서는 모든 경우의 수를 계산하여 확률을 구했다면, 이 문제에서는 재귀 호출
할 때마다 직접 확률을 구한다.