60:n 주사위의 포인트

2004 단어

귀속:

int getNsumCount(int n, int sum)
{
    if (n < 1 || sum < n || sum>6 * n)return 0;
    if (n == 1)return 1;
    int resCount = 0;
    resCount = getNsumCount(n - 1, sum - 1) + getNsumCount(n - 1, sum - 2) + getNsumCount(n - 1, sum - 3) +
        getNsumCount(n - 1, sum - 4) + getNsumCount(n - 1, sum - 5) + getNsumCount(n - 1, sum - 6);
    return resCount;
}

동적 계획


1. 현재 변수는 주사위 개수, 포인트와 있다.k개의 주사위, 포인트와 n이 있을 때 출현 횟수는 f(k, n)로 기록한다.그러면 k-1 주사위 단계와의 관계는 어떻게 됩니까?
2. k-1개의 주사위가 있을 때 주사위를 하나 더 추가하면 이 주사위의 포인트는 1, 2, 3, 4, 5 또는 6일 수 있습니다.그 k개의 주사위가 포인트를 얻고 n인 경우:
(k-1, n-1): k번째 주사위는 포인트 1 던졌습니다.
(k-1, n-2): k번째 주사위는 포인트 2를 던졌습니다.
(k-1, n-3): k번째 주사위는 포인트 3을 던졌습니다.
....
(k-1, n-6): k번째 주사위는 포인트 6을 던졌습니다.
k-1개의 주사위를 토대로 주사위 하나를 더 추가하면 포인트와 n이 나오는 결과는 이 6가지 상황입니다!그래서: f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)3.주사위 1개, f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1.반환 함수, 반환 및 n 발생 횟수.모든 것과 출현 횟수의 총계는 6^n이다.
https://blog.csdn.net/k346k346/article/details/50988681
int getNsumCountnotRecusion(int n, int *count)
{
    if (n < 1)return -1;
    count[0] = count[1] = count[2] = count[3] = count[4] = count[5] = 1;
    for (int i = 2; i <= n; i++)
    {
        for (int sum = 6 * i; sum >= i; sum--)
        {
            int tmp1 = ((sum - 1 - (i - 1)) >= 0 ? count[sum - 1 - (i - 1)] : 0);// 2 
            int tmp2 = ((sum - 2 - (i - 1)) >= 0 ? count[sum - 2 - (i - 1)] : 0);// 3 
            int tmp3 = ((sum - 3 - (i - 1)) >= 0 ? count[sum - 3 - (i - 1)] : 0);// i-1
            int tmp4 = ((sum - 4 - (i - 1)) >= 0 ? count[sum - 4 - (i - 1)] : 0);
            int tmp5 = ((sum - 5 - (i - 1)) >= 0 ? count[sum - 5 - (i - 1)] : 0);
            int tmp6 = ((sum - 6 - (i - 1)) >= 0 ? count[sum - 5 - (i - 1)] : 0);
            count[sum - i] = tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6;
        }
    }
    return 0;
}

좋은 웹페이지 즐겨찾기