要求:输出所有的和的可能的概率
思路:共六的n次方种情况,n个骰子范围是n,6n
设dp[n][x]为n个骰子掷出和x的概率,显然dp[n][x]=Σdp[n-1][x-i]x1/6,i从1到6
class Solution {
public:
vector<double> dicesProbability(int n) {
vector<vector<double>> dp(n+1,vector<double>(6*n+1));
for(int i=1;i<=6;++i)
dp[1][i]=1/6.0;
for(int i=2;i<=n;++i){
for(int sum=i;sum<=6*i;++sum){
for(int k=1;k<=6&&k<=sum;++k){
dp[i][sum]+=dp[i-1][sum-k];
}
dp[i][sum]/=6;
}
}
vector<double> ans;
for(int i=n;i<=6*n;++i)
ans.push_back(dp[n][i]);
return ans;
}
};
空间优化,这里倒过来了
class Solution {
public:
vector<double> dicesProbability(int n) {
vector<double> dp(6,1/6.0);
for(int i=2;i<=n;++i){
vector<double> tmp(5*i+1);
for(int j=0;j<dp.size();++j){
for(int k=0;k<=5;++k){
tmp[j+k]+=dp[j]/6.0;
}
}
dp=tmp;
}
return dp;
}
};