[DP] $의 P2059 $ 확률 카드 게임

[DP] 확률 \ (P2059 \) 카드 게임

링크

제목 설명

\ (N \) 개인이 게임을 원에 앉아. 처음에 우리는에서 시계 방향으로 모든 선수를 넣어 \ (1 \)(N \) \ 수 있습니다. 첫 번째 라운드는 제 플레이어이다 \ (1 \) 상인있다. 각 라운드의 카드의 숫자 가정, 카드 더미에서 카드를 선택 (즉, 동일한 확률로한다) 임의 만드는 것입니다 \ (X 축이 \) 키를 누릅니다, 모든 선수들에게 보여주기 위해 카드의 첫 번째 숫자를 결정, 수의 딜러 위치에서 시계 방향으로 \ (X \) 개인은 게임을 종료하기 위해 실행됩니다. 그런 다음 카드는 카드와 개편의 더미로 다시 배치됩니다. 누가하는 대리점의 다음 라운드가 될 것 다음 사람을 시계 방향으로 실행되었다. 그런 후 (N-1 \) \ 마지막 라운드 후에는 한 사람을 떠나,이 게임은 승자입니다. 이제 사전에 알고 총 \ (M \) 카드는 각 카드에 그 번호를 알고있다. 이제 각 플레이어의 승리의 확률을 결정해야합니다.

입력 형식

첫 번째 행은 두 정수 포함 \ (N, M \) 를 각각 나타낼 수 및 선수 카드의 총 수.

다음 줄 포함 \ (M \) 의 정수는, 각각 각 카드에 기입 된 숫자를 제공한다.

출력 형식

함유 출력 라인 (N \) \ 소수점 2 자리 주어진 백분율 숫자 형태의 고체. 플레이어 별도로 주어 \ (1 \) 플레이어에 \ (N \) 확률 스페이스로 구분 각각의 확률, 마지막 공백 승리.

샘플 ]

5 5
2 3 5 7 11
22.72% 17.12% 15.36% 25.44% 19.36%
4 4
3 4 5 6
25.00% 25.00% 25.00% 25.00%

내용 (30 \) \ 데이터 %있다 \ (1 \ 당량의 N \ 당량의 10 \)

내용 (50 \) \ 데이터 %있다 \ (1 \ 당량의 N \ 당량의 30 \)

들어 (100 \) \ 데이터 %가있다 (1 \ 당량 N의 \의 당량 \ 50, 1 \ 당량 M의 \의 당량 50, 1 \ 당량 \) , 각 카드의 번호 \ (\ 당량 50 \)를

\(해결책\)

사실,이 질문은 내가 전혀 생각하기 시작했다. , 검색 생각하기 시작하지만 많은 것들을 기록하는 것, 나는 전송이 가능하지 않을 생각했다. 즉 ...... 뒤로 검색?

세트 \ (F [I] [J ] \) 갖도록 \ (나는 \) 개별 시간은 \ (j의 \) 개인 승리 확률. 확률이 추가 될 수 있기 때문에, 다시 가압 될 수있다.

어떻게 전송하는? 손이가 발견 \ (내가 \) 개인의 경우, 딜러 카드 그린 (케이 \) \ , 다음 \ (I - 1 \) 개인 첫 번째 \ (J의 \) 개인 위치입니다 ...... 분류 토론. 만약 <\ (K J \) , \ - (K \ J = J) , 경우 (J \ \ K)> , \ (J = I - K + J \) 의 경우 \ (K = J \) ,하지 때문에, 고려 \ (J의 \)가 사망했다.

그래서, 너무 오래 전이 방정식 :

int p = a[k] % i == 0? i:a[k] % i;
if(p > j) f[i][j] += f[i - 1][i - p + j] / m;
else if(p < j) f[i][j] += f[i - 1][j - p] / m;

\ (그건 ~~ 모든 \)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long long read(){
    long long x = 0; int f = 0; char c = getchar();
    while(c < '0' || c > '9') f |= c == '-', c = getchar();
    while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
    return f? -x:x;
}

int n, m, a[57];
double f[57][57];
int main(){
    n = read(); m = read();
    for(int i = 1; i <= m; ++i) a[i] = read();
    f[1][1] = 1.0;
    for(int i = 2; i <= n; ++i)
        for(int j = 1; j <= i; ++j)
            for(int k = 1; k <= m; ++k){
                int p = a[k] % i == 0? i:a[k] % i;
                if(p > j) f[i][j] += f[i - 1][i - p + j] / m;
                else if(p < j) f[i][j] += f[i - 1][j - p] / m;
            }
    printf("%.2lf%%", f[n][1] * 100);
    for(int i = 2; i <= n; ++i) printf(" %.2lf%%", f[n][i] * 100);
    return 0;
}

추천

출처www.cnblogs.com/kylinbalck/p/11260150.html