※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13703번 문제인 물벼룩의 생존확률이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13703
13703번: 물벼룩의 생존확률
수면에서 k 센티미터 아래에 있는 물벼룩은 1초마다 각각 1/2의 확률로 위 또는 아래로 1 센티미터 이동한다. 물벼룩은 수면에 닿자마자 기다리고 있던 물매암이들에 의해 먹혀 없어진다. 예를
www.acmicpc.net
주어진 확률표기의 분모는 위와 아래의 나열로 가능한 경우의 수와 같은 2^N이므로, 구하는 값 S는 물벼룩이 수면 아래에서 N초동안 움직이는 경우의 수와 같다.
물벼룩이 t초에 수면아래 d 위치에 있을 경우의 수는 (물벼룩이 t-1초에 수면 아래 d+1위치에 있을 경우의 수) + (물벼룩이 t-1초에 수면 아래 d-1위치에 있을 경우의 수)로 계산할 수 있다. (단, d+1>0 이다.) 이 점화식을 이용하여 물벼룩이 N초에 수면 아래 d 위치에 있을 경우의 수들을 각각 구하고 이들을 합쳐 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int K, N;
ll dp[64][128];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> K >> N;
dp[0][K] = 1;
for (int t = 1; t <= N; t++) {
for (int d = 1; d < 127; d++) {
dp[t][d] = dp[t - 1][d - 1] + dp[t - 1][d + 1];
}
}
ll ans = 0;
for (int d = 1; d < 127; d++) ans += dp[N][d];
if (K == 0) cout << 0;
else cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ 26939 // C++] Biblioteket (0) | 2022.12.30 |
---|---|
[BOJ 26940 // C++] Chokladkartongen (0) | 2022.12.30 |
[BOJ 1380 // C++] 귀걸이 (0) | 2022.12.29 |
[BOJ 26941 // C++] Pyramidbygge (0) | 2022.12.28 |
[BOJ 13702 // C++] 이상한 술집 (0) | 2022.12.28 |