PS

BOJ 17211 : 좋은 날 싫은 날

lickelon 2024. 12. 28. 23:58
  • 문제 링크 : boj.kr/17211
  • 난이도 : S5
  • 태그 : 확률론, DP

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, c;
    cin >> n >> c;

    ld p[2][2];
    cin >> p[0][0] >> p[0][1] >> p[1][0] >> p[1][1];

    vector<array<ld, 2>> dp(n+1);
    dp[0][c] = 1;

    for(int i = 1; i <= n; i++) {
        dp[i][0] = dp[i-1][0] * p[0][0] + dp[i-1][1]*p[1][0];
        dp[i][1] = dp[i-1][0] * p[0][1] + dp[i-1][1]*p[1][1];
    }

    cout << int(dp[n][0] * 1000) << "\n";
    cout << int(dp[n][1] * 1000) << "\n";

    return 0;
}

풀이

각 날짜의 확률을 다음의 식을 통해 구할 수 있다.

i일차가 좋은 날일 확률 =  i-1일차가 좋은 날일 확률 * 좋은 날 이후 좋은 날일 확률 + i-1일차가 싫은 날일 확률 * 싫은 날 이후 좋은 날일 확률

i일차가 싫은 날일 확률 =  i-1일차가 좋은 날일 확률 * 좋은 날 이후 싫은 날일 확률 + i-1일차가 싫은 날일 확률 * 싫은 날 이후 싫은 날일 확률

식을 구했으므로 모든 날에 대해서 DP를 수행하면 답을 구할 수 있다.

728x90

'PS' 카테고리의 다른 글

BOJ 10816 : 숫자 카드 2  (0) 2024.12.30
BOJ 33049 : 마작에서 가장 어려운 것  (0) 2024.12.30
BOJ 25369 : 카드 숫자 곱을 최소로 만들기  (0) 2024.12.27
BOJ 31563 : 수열 회전과 쿼리  (0) 2024.12.26
BOJ 8975 : PJESMA  (1) 2024.12.25