위의 식은 바로 다음번 주사위만 가지고 앞으로 계속할지를 결정한다는 것이 문제였습니다.
아래와 같이 맨 마지막부터 되돌아 가게 수정하니 해결되었습니다.
N=int(input()) dp2 =[[[0 for _ in range(6)] for _ in range(6)] for _ in range(N-1)] ans=0 def prize(i,j,k): if i == j == k: return 10000 + (k + 1) * 1000 elif i == j: return 1000 + (j + 1) * 100 elif i == k: return 1000 + (k + 1) * 100 elif j == k: return 1000 + (k + 1) * 100 else: return (max([i, j, k]) + 1) * 100 for n in range(N-2): for i in range(6): for j in range(6): for k in range(6): cur_val=prize(i,j,k) expected_val=dp2[n][j][k] expected_val=expected_val/6 if expected_val<cur_val or n==N-2: dp2[n+1][i][j] += prize(j,i,k) else: dp2[n+1][i][j]+=expected_val for i in range(6): for j in range(6): ans+=dp2[N-2][i][j] print(ans/216)
waroad 2년 전
3,4는 제대로 나오는데 그 뒤부터 값이 나와야 할 값보다 작아지더라고요.
dp2[n][a][b]는 3-n번째 주사위를 굴렸을 때 그 전꺼 두 개가 a,b인 확률입니다.