반응형
문제출처
https://www.acmicpc.net/problem/3056
문제풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * dp + bitmask문제는 유형이 비슷한거 같다. 지금까지 비슷한 유형만 푼거일수도... * 입력에서의 행을 요원, 열을 확률로 생각하면 되는데 0번 요원은 100, 1번요원은 13, 2번요원은 90을 * 계산해주면 출력값이 나온다. 처음에 이해를 잘못해서 출력이 어떻게 나오는지 고생... * x축을 기준으로 탐색을 해주면서 방문을 안한 확률에 대해서만 방문표시를 하고 확률을 곱해준다. * 기저사례에서 확률을 곱해주기 때문에 0을 리턴하면 안되기 때문에 1을 리턴해주면 된다. * 이 문제를 처음 구현했을때 시간초과가 나왔는데 처음에는 이해를 못했다. * 문제는 기저사례였다. 기존에는 if(y==n) return 1; 이런식으로 했었는데 * bitmask를 사용해서 if(state == (1<<n)-1)로 조건을 바꿔주니 맞았다. * 아마 y==n이면 제때 빠져나오지 못하는 경우가 존재하는것 같다. * 그리고 이 문제에서 출력형식이 뭔가 잘못된거 같다. * 오차범위가 소수점 6자리인데 출력은 5자리까지만 나와있다. * 그런데 5자리로만 출력하면 틀렸습니다가 나온다 ㅡㅡ (이해를 잘못하고 있는건가?) */ | cs |
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> #include <algorithm> #define MAX 20 using namespace std; int n; double p[MAX][MAX], dp[1<<MAX]; double solve(int y, int state) { if(state == (1<<n)-1) return 1; double &ret=dp[state]; if(ret!=0.0) return ret; for(int i=0; i<n; i++) { if((state & (1<<i))) continue; ret=max(ret, solve(y+1, state|(1<<i)) * p[y][i]); } return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout.precision(6); cout<<fixed; cin>>n; for(int y=0; y<n; y++) for(int x=0; x<n; x++) { cin >> p[y][x]; p[y][x] /= 100.0; } cout<<solve(0, 0) * 100.0<<endl; return 0; } | cs |
반응형
'Algorithm' 카테고리의 다른 글
[BOJ 10814] 나이순 정렬 (0) | 2019.02.13 |
---|---|
[BOJ 1026] 보물 (0) | 2019.02.12 |
[BOJ 1102] 발전소 (0) | 2019.01.30 |
[BOJ 1799] 비숍 (0) | 2019.01.29 |
[Programmers] 정렬 - 가장큰수 (0) | 2019.01.28 |