「剣指オファー」ブラシ質問シリーズ-(62)n個のサイコロポイントの数

トピック

地面にn個のサイコロを投げ、すべてのサイコロの上向きの点の合計がsになります。nを入力して、sのすべての可能な値の確率を出力します。
答えを返すには、浮動小数点数の配列を使用する必要があります。ここで、i番目の要素は、n個のサイコロのセットの中で転がれるi番目に小さい確率を表します。

入力:2
出力:[0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

アイデア

動的プログラミングソリューション。
ダイスがn個ある場合、ポイントの合計の最小値はnで、最大値はn * 6です。
n行6n列の2次元配列を作成します。dp[i] [j]は、iダイス、ポイント数、jの出現回数を表します。
サイコロが1つしかない場合、ポイントと考えられる状況は1、2、3、4、5、6で、それぞれの発生数は1です。
サイコロを追加すると、このサイコロが出現するポイントの数も1〜6であり、出現確率は同じです。ポイントの合計がsの場合、新しいダイスポイントは1、古いダイスポイントはs-1、新しいダイスポイントは2、古いダイスポイントはs-2、...と表示されます。したがって、この時点で、sのポイント数と出現数は、(s-1)、(s-2)、(s-3)、(s-4)、(s-5)、(s-6)の出現数の合計です。 。
2つのサイコロのポイントとsの範囲は、n = 2からn * 6 = 18までです。

ここに画像の説明を挿入

コード

class Solution:
    def twoSum(self, n: int) -> List[float]:
        dp = [[0 for _ in range(6*n+1)] for _ in range(n+1)]
        for j in range(1,7):
            dp[1][j]=1
        
        for i in range(2,n+1):
            for j in range(i,6*i+1):
                for s in range(1,7):
                    if j-s<0: break
                    dp[i][j]+=dp[i-1][j-s]
        
        res=[]
        for i in range(n,6*n+1):
            res.append(dp[n][i]/(6**n))
        return res


最適化

上記のアルゴリズムのスペースの複雑さはO(n * n)ですが、使用されないか、一度使用されただけで使用されなくなったスペースがたくさんあります。スペースの複雑さから最適化する方法を考えてください。
n番目のサイコロのデータは、最初のn-1個のサイコロによって保存されたデータによって解決されることがわかります。したがって、各ソリューションの前回の結果を知るだけで済みます。1次元配列を適用し、サイコロを追加するたびに、配列の値を右から左に更新します。更新の各ラウンドでは、配列の最初の位置を0に初期化する必要があることに注意してください。

コード

class Solution:
    def twoSum(self, n: int) -> List[float]:
        dp = [0 for _ in range(6*n+1)]
        for j in range(1,7):
            dp[j]=1
        
        for i in range(2,n+1):
            for j in range(6*i,i-1,-1):
                dp[j]=0
                for s in range(1,7):
                    if j-s<i-1: break
                    dp[j]+=dp[j-s]
                    
        res=[]
        for i in range(n,6*n+1):
            res.append(dp[i]/(6**n))
        return res

複雑さ

最適化前:
時間の複雑度:O(n ^ 2)
スペースの複雑度:O((n + 1)(6n + 1))= O(n ^ 2)

最適化後:
時間の複雑度:O(n ^ 2)
スペースの複雑度:O(n)

おすすめ

転載: blog.csdn.net/weixin_44776894/article/details/107509128