SNAIL문제를 교재와 같이 탑다운 방식으로 풀면 정답이 나오는데,
바텀업 방식으로 풀면 1000 1000과 같은 입력에서 1보다 훨씬 작은 수가 나옵니다.
예제는 모두 정확하게 풀리고요.
제 생각에는 double이 오차가 있어서 이런 차이가 나온다고 생각을 했는데, 탑 다운에서는 같은 계산을 하면서 답이 정확히 나오는게 이해가 안되네요.
어떤 차이가 있는 걸까요...
바텀업 - 안되는 코드
바텀업으로 푼 코드입니다. 503 503 넣어도 1이 안되네요.. 그보다 작은 수는 잘되는 거 같습니다
#include <iostream>
using namespace std;
int main(){
double dp[1001][1001] = {0., };
dp[0][0] = 1;
dp[1][1] = 0.25;
dp[1][2] = 0.75;
for(int day = 2; day <= 1000; day++){
for(int dis = 1; dis <= 1000; dis++){
dp[day][dis] = dp[day-1][dis-1] * 0.25 + dp[day-1][dis-2]*0.75;
}
}
int T;
cin >> T;
while(T--){
int n, m;
cin >> n >> m;
double res = 0.;
for(int dis = 0; dis < n; dis++){
res += dp[m][dis];
}
cout.precision(10);
cout.setf(ios::showpoint);
cout << 1.0-res << endl;
}
탑 다운 - 되는 코드
탑다운으로 푼 코드입니다.
정답이구요.
#include <iostream>
using namespace std;
double dp[1001][1001] = {0., };
double snail(int dis, int day){
if(day == 0 && dis == 0) return 1.;
if(day == 0) return 0;
if(dis < 0) return 0;
if(dp[dis][day] != -1) return dp[dis][day];
dp[dis][day] = snail(dis-1, day-1) * 0.25 + snail(dis-2, day-1) * 0.75;
return dp[dis][day];
}
int main(){
int T;
cin >> T;
while(T--){
int n, m;
cin >> n >> m;//거리, 날짜
for(int i = 0; i <=1000; i++){
for(int j = 0; j <= 1000; j++)
dp[i][j] = -1;
}
cout.precision(10);
double res = 0;
for(int dis = 0; dis < n; dis++){
res -= snail(dis, m);
}
cout << res << endl;
}
return 0;
}
무슨 차이가 있는 걸까요
6년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
sth534
문제
[[problem:SNAIL]]
질문
SNAIL문제를 교재와 같이 탑다운 방식으로 풀면 정답이 나오는데,
바텀업 방식으로 풀면 1000 1000과 같은 입력에서 1보다 훨씬 작은 수가 나옵니다.
예제는 모두 정확하게 풀리고요.
제 생각에는 double이 오차가 있어서 이런 차이가 나온다고 생각을 했는데, 탑 다운에서는 같은 계산을 하면서 답이 정확히 나오는게 이해가 안되네요.
어떤 차이가 있는 걸까요...
바텀업 - 안되는 코드
바텀업으로 푼 코드입니다. 503 503 넣어도 1이 안되네요.. 그보다 작은 수는 잘되는 거 같습니다
탑 다운 - 되는 코드
탑다운으로 푼 코드입니다.
정답이구요.
무슨 차이가 있는 걸까요
6년 전