waroad   2년 전

3,4는 제대로 나오는데 그 뒤부터 값이 나와야 할 값보다 작아지더라고요.

dp2[n][a][b]는 3-n번째 주사위를 굴렸을 때 그 전꺼 두 개가 a,b인 확률입니다. 

waroad   2년 전

위의 식은 바로 다음번 주사위만 가지고 앞으로 계속할지를 결정한다는 것이 문제였습니다.

아래와 같이 맨 마지막부터 되돌아 가게 수정하니 해결되었습니다.

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)

댓글을 작성하려면 로그인해야 합니다.