劍指offer T60 n個骰子的點數

2021-10-07 18:37:50 字數 750 閱讀 4092

case1:暴力列舉,直接超時,時間複雜度o(6^n), 空間複雜度o(n),dfs不減枝的話會窮舉所有可能,這裡每一次有6種可能,共做n次,所有時間複雜度為o(6^n)

class solution 

for(int digtial=1;digtial<=6;digtial++)

}public double twosum(int n)

return pro;

}}

case2: 思想將n個骰子各擲1次,等價於將1個骰子擲n次,所以,總共有6^n個組合方式。所以和的所有取值為從最小:k,k+1,k+2…6*k。(k=1…n)

然後我們就可以利用dp思想了

dp[k][counts] 表示擲k次後和為counts的組合方式數

狀態轉移方程:

dp[k][counts] += dp[k-1][counts-j] if(counts>j) else:+0 其中j=1,2,3…6也就是每個骰子的數值,條件是counts>j而不是counts>=j,是為了跳過計算k=1時的情況

時間複雜度o(n*(n+1)/2),空間複雜度o(n^2)

class solution 

//遍歷求取每個狀態

for(int k=1;k<=n;k++)}}

}return res;

}}

劍指 Offer 60 n個骰子的點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。示例 1 輸入 1 輸出 0.16667,0.16667,0.16667,0.16667,0....

劍指 Offer 60 n個骰子的點數

用dp i j 表示擲完 i 個骰子之後其點數之和為 j 的總次數,這可以由 投擲完 n 1 枚骰子後,對應點數 j 1,j 2,j 3,j 6 出現的次數之和轉化過來。即 1 class solution 910 for int i 2 i n i 17 18 1920 int total pow...

劍指 Offer 60 n個骰子的點數

dp三步走 1.表示狀態 dp i j 表示擲i個骰子,點數之和為j的概率。2.狀態轉移方程 遞推公式dp i j dp i 1 j 1 dp i 1 j 6 i個骰子和為j的概率 i 1個骰子和為j 1 最後乙個骰子擲出1的概率 i 1個骰子和為j 6 最後乙個骰子擲出6的概率 3.邊界處理 i ...