깊이가 n 미터인 우물의 맨 밑바닥에 달팽이가 있습니다. 이 달팽이는 우물의 맨 위까지 기어올라가고 싶어하는데, 달팽이의 움직임은 그 날의 날씨에 좌우됩니다. 만약 비가 내리면 달팽이는 하루에 2미터를 기어올라갈 수 있지만, 날이 맑으면 1미터밖에 올라가지 못합니다.
여름 장마가 찾아와, 앞으로 m 일간 각 날짜에 비가 올 확률이 정확히 75%일 전망입니다. m 일 안에 달팽이가 우물 끝까지 올라갈 확률을 계산하는 프로그램을 작성하세요.
입력의 첫 줄에는 테스트 케이스의 수 C(1≤C≤50) 가 주어집니다. 그 후 각 줄에 우물의 깊이 n(1≤n≤1000)과 장마 기간의 길이 m(1≤m≤1000) 이 주어집니다.
각 테스트 케이스마다 한 줄에 m일 안에 달팽이가 우물을 탈출할 수 있을 확률을 출력합니다. 10−7 이하의 상대/절대 오차가 있는 답은 정답으로 인정됩니다.
#include<bits/stdc++.h>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n'
using namespace std;
int n,m;
double cache[1001][2002];
double jangmaIscomming(int day, int climb)
{
if(day==m)
{
if(climb >= n) return 1;
return 0;
}
double& ret = cache[day][climb];
if(ret!=-1.0) return ret;
return ret = 0.75*jangmaIscomming(day+1,climb+2) + 0.25*jangmaIscomming(day + 1,climb+1);
}
int main()
{
FASTio;
int t;
cin >> t;
while(t--)
{
for(int i=0; i<1001; i++)
{
for(int j=0; j<2002; j++)
{
cache[i][j]= -1.0;
}
}
cin >> n >> m;
cout << fixed;
cout.precision(10);
cout << jangmaIscomming(0,0) << endl;
}
return 0;
}
책과 문제풀이사이트의 문제가 달라서 흠칫했지만 꽤 간단하게 풀었던 문제였다.
double
자료형에서는 memset()
함수가 안된다는 것을 몰라서 삽질을 했다.