(검지 Offer) 면접 문제 43:n 주사위 점수

2571 단어

제목:


n개의 주사위를 바닥에 놓고 모든 주사위가 위쪽으로 향하는 점수의 합은 s이다.n을 입력하여 s의 모든 가능한 값이 나타날 확률을 출력합니다.

생각:


s가 나타날 수 있는 값의 범위는 n--6*n
1. 전체 배열
거슬러 올라가는 방법은 n개의 주사위(6면)의 전체 배열을 열한 다음에 매번 모든 값을 배열하는 합을 계산하고 이 합이 나타나는 횟수를 통계한다. 6^n(전 배열의 모든 가능성), 즉 확률로 나눈다.코드 목록이 없습니다
2. 귀속 사상
귀속적인 사상을 통해 n개의 주사위의 포인트를 누적하다.
n개의 주사위의 포인트와 n개의 주사위의 포인트를 요구하면 먼저 전 n-1개의 주사위의 포인트와 n개의 주사위의 포인트를 더한다.
귀속 종료 조건: n=1, 이때 어떤 점과 나타나는 횟수+1;
3. 동적 기획 사상
가령 f(m, n)는 m번째 주사위를 던질 때 점수의 합과 n이 나타나는 횟수를 나타내고 m번째 주사위를 던질 때의 점수의 합은 m-1번째 주사위를 던질 때만 관련이 있다.
귀속방정식: f(m, n)=f(m-1, n-1)+f(m-1, n-2)+f(m-1, n-3)+f(m-1, n-5)+f(m-1, n-5)+f(m-1, n-6)는 이번 라운드의 점수와 n의 출현 횟수가 지난 라운드의 점수와 n-1, n-2, n-3, n-4, n-5, n-6의 출현 횟수의 합을 나타낸다.
초기 조건: 1라운드의 f(1), f(2), f(3), f(4), f(5), f(6)는 모두 1이다.

코드:


1. 귀속 방법
#include 
#include 

using namespace std;

int g_maxValue=6;

void Probability(int original,int index,int curSum,int* pProbability){
    if(index==0){
        pProbability[curSum-original]+=1;
        return;
    }
    for(int i=1;i<=6;i++)
        Probability(original,index-1,curSum+i,pProbability);
}

void PrintProbability(int n){
    if(n<1)
        return;
    int maxSum=n*g_maxValue;
    int* pProbability=new int[maxSum-n+1];
    for(int i=n;i<=maxSum;i++)
        pProbability[i-n]=0;
    int curSum=0;
    Probability(n,n,curSum,pProbability);

    int total=pow((double)g_maxValue,n);
    double prob=0;
    for(int i=n;i<=maxSum;i++){
        double ratio=(double)pProbability[i-n]/total;
        prob+=ratio;
        cout<

2. 동적 계획
#include 
#include 

using namespace std;

int g_maxValue=6;
void PrintProbability(int n){
    if(n<1)
        return;

    int* pProbability[2];
    pProbability[0]=new int[g_maxValue*n+1];
    pProbability[1]=new int[g_maxValue*n+1];

    for(int i=0;i<=g_maxValue*n;i++){
        pProbability[0][i]=0;
        pProbability[1][i]=0;
    }

    int flag=0;
    for(int i=1;i<=g_maxValue;i++)
        pProbability[flag][i]=1;

    for(int k=2;k<=n;k++){
        for(int i=0;i

좋은 웹페이지 즐겨찾기