격자에서 정확히 S걸음을 걸으며 각 칸의 몬스터를 방문 시 확률 P 또는 Q로 잡을 때, 잡는 몬스터 수의 기댓값을 최대로 만든다.
어려움8동적 계획법비트 연산그래프수학아직 제출이 없습니다시간 제한5초메모리 제한512 MB코드자몬은 몬스터 조련사가 현실 세계를 돌아다니며 몬스터를 잡는 모바일 게임이다. 당신이 쓰는 휴대폰은 낡아서 배터리가 금방 닳는다. 몬스터를 최대한 많이 잡으려면 이동 경로를 신중하게 골라야 한다.
코드자몬 세계는 R행 C열짜리 격자다. 행 번호는 위에서 아래로 0부터 매기고, 열 번호는 왼쪽에서 오른쪽으로 0부터 매긴다. 당신은 Rs행 Cs열 칸에서 출발해 정확히 S번 이동한다. 한 번의 이동으로는 지금 있는 칸과 변을 맞댄 칸으로만 갈 수 있다. 꼭짓점만 맞댄 칸으로는 갈 수 없다.
아직 몬스터를 잡지 못한 칸으로 들어가면 그 칸의 몬스터를 잡는 시도를 한다. 그 칸에 몬스터 유인기가 있으면 확률 P로 잡고, 없으면 확률 Q로 잡는다. 한 번 잡은 몬스터는 사라지므로 그 칸에서는 다시 잡을 수 없다. 잡지 못했다면 나중에 그 칸에 다시 들어갔을 때 또 시도한다. 출발 칸은 특별하다. 첫 이동을 하기 전에는 출발 칸의 몬스터를 잡을 기회가 없다.
이동을 시작하기 전에 경로를 최적으로 계획한다고 할 때, 잡는 몬스터 수의 기댓값이 최대 얼마인지 구하라.
R=1이고 C=1이면 이동할 수 있는 칸이 하나도 없다. 이때는 S가 1 이상이어도 기댓값이 0이다.
첫 줄에 테스트 케이스의 수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 줄에는 정수 다섯 개 R, C, Rs, Cs, S가 공백으로 구분되어 주어진다. R과 C는 격자의 행 수와 열 수, Rs와 Cs는 출발 칸의 행 번호와 열 번호, S는 이동 횟수다.
그다음 줄에는 소수 P와 Q가 주어진다. P는 몬스터 유인기가 있는 칸에서 몬스터를 잡을 확률이고, Q는 유인기가 없는 칸에서 잡을 확률이다. 두 값 모두 소수점 아래 넷째 자리까지 정확히 주어진다.
그다음 R개의 줄에는 각각 문자 C개가 공백으로 구분되어 주어진다. i번째 줄의 j번째 문자는 i행 j열 칸을 뜻한다. 각 문자는 유인기가 없는 칸을 뜻하는 . 또는 유인기가 있는 칸을 뜻하는 A 중 하나다.
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, y는 잡는 몬스터 수의 기댓값의 최댓값이다.
y는 소수점 아래 여덟째 자리에서 반올림해 소수점 아래 자릿수가 정확히 일곱 개가 되도록 출력한다. 값이 정수여도 2.0000000처럼 일곱 자리를 모두 적는다. 반올림 결과가 갈리는 입력, 즉 정답이 반올림 경계에 정확히 걸리는 입력은 주어지지 않는다.
첫 번째 예제의 첫 테스트 케이스에서 최적 경로 하나는 (0,0)→(0,1)→(0,2)→(1,2)→(2,2)→(2,3)이다. 이 경로에서 잡는 몬스터 수의 기댓값은 0.2+0.2+0.2+0.8+0.2=1.6이다. 첫 이동을 하기 전에는 몬스터를 잡을 기회가 없으므로 확률을 여섯 개가 아니라 다섯 개만 더한다.
같은 예제의 두 번째 테스트 케이스에서 최적 경로 하나는 (9,1)→(9,2)→(8,2)→(8,3)→(8,2)이다. 기댓값은 0.1+0.6121+0.1+0.23743359=1.04953359이고, 출력 형식에 맞춰 반올림하면 1.0495336이다. 마지막 항 0.23743359는 (8,2)에 두 번째로 들어갈 때 그 칸에 몬스터가 아직 남아 있을 확률 1−0.6121에 잡을 확률 0.6121을 곱한 값이다.