大數據中如何解析n個骰子的點數,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創新互聯公司專注于網站建設|成都網站維護公司|優化|托管以及網絡推廣,積累了大量的網站設計與制作經驗,為許多企業提供了網站定制設計服務,案例作品覆蓋成都發電機維修等行業。能根據企業所處的行業與銷售的產品,結合品牌形象的塑造,量身建設品質網站。
把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s的所有可能的值出現的概率。
你需要用一個浮點數數組返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。
示例 1:
輸入: 1
輸出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
示例 2:
輸入: 2
輸出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
限制:
1 <= n <= 11
解題思路
1,這是一個動態規劃題目
2,假設有i個骰子,可以拼出的點數為i,i+1,i+2,......,i*6,共2*i-i+1個
3,i取值范圍是1...n
4, 用dp[i][j],表示,i個骰子,點數和為j的組合個數
5,狀態轉移方程為
dp[i][j]=sum(dp[i-1][j-k]) k=1,2,3,4,5,6
6,由于用到了i-1,所以遞增
7,結果取,i=n那一列,j變化范圍從 i到2*i的數據,除以 pow(6,n)
代碼實現
func twoSum(n int) []float64 {var r []float64dp:=make([][]int,n+1)for i:=0;i<n+1;i++{dp[i]=make([]int,n*6+1)}s:=pow(6,n)//1 1...6//2 2...12for i:=1;i<=6;i++{dp[1][i]=1}for i:=2;i<=n;i++{for j:=i;j<=i*6;j++{for k:=1;k<=6;k++{if j>k{dp[i][j]+=dp[i-1][j-k]fmt.Println( dp[i][j],":",i,j,"=>",i-1,j-k)}}if j==i*6{// dp[i][j]=1}}}for j:=n;j<=n*6;j++{r=append(r,float64(dp[n][j])/float64(s))}fmt.Println(dp[n][n:n*6+1])fmt.Println(dp,s)return r}func pow(x,y int)int{r:=1for i:=0;i<y;i++{r*=x}return r}/**解題思路dp[i][j]表示當n=i時,和為j出現的排列情況總數;狀態轉移方程:dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]+dp[i-1][j-5]+dp[i-1][j-6];初始條件:dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=dp[1][5]=dp[1][6]=1;代碼class Solution {public:vector<double> twoSum(int n) {vector<vector<int>>dp(n+1,vector<int>(6*n+1,0));double num=pow(6,n);vector<double>res(5*n+1,1/(double)6);//初始狀態for(int i=1;i<=6;i++)dp[1][i]=1;for(int i=2;i<=n;i++){ //從2到n計算dpfor(int j=i;j<=i*6;j++){ //表示當n=i時候的點數和取值從i到6ifor(int k=1;k<=6;k++){ //dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]+dp[i-1][j-5]+dp[i-1][j-6];if(j-k>0)dp[i][j]+=dp[i-1][j-k]; //第i個骰子點數一定比i-1個骰子點數大if(i==n)res[j-i]=dp[i][j]/num;}}}return res;}};*/
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。
                本文名稱:大數據中如何解析n個骰子的點數
                
                新聞來源:http://www.yijiale78.com/article30/jcsjso.html
            
成都網站建設公司_創新互聯,為您提供營銷型網站建設、企業網站制作、、標簽優化、建站公司、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯