题意理解
给定n个骰子,求n个骰子的和出现的概率,按照从小到大的顺序排列可能和的概率。
问题分析
用动规
状态变量是 n个骰子和为s的概率。
状态转移方程是 dp[n][s] = sum( dp[n-1][s-i]* 1.0 / 6 ) , 1 <= i <= 6;
为了降低存储,可以保留两行。
因为是double,所有 1/6改成1.0/6才能保留小数
其他
好题。加油
学习的忽视的一个关键点是,不完全按照自己的思路来,学习别人的思路,偷懒,投机,用少的思维力和少的时间完成解决方案设计和辅助实施。
链接
class Solution {
public:
vector<double> dicesProbability(int n) {
vector<double> array1(n*6+1, 0);
vector<double> array2(n*6+1, 0);
for(int i = 1; i <= 6; i ++) {
array1[i] = 1.0/6;
}
cout << '3' << endl;
for (int i = 2; i <= n; i++) {
for(int j = 2; j <= n*6; j ++) {
cout << '4' << endl;
double cur = 0;
for (int k = 1; k <= 6 && j - k >= 1; k ++) {
cout << '5' << endl;
cur += array1[j - k] * 1.0/6;
}
array2[j] = cur;
}
cout << '1' << endl;
copy(array2.begin(), array2.begin() + n*6 + 1, array1.begin());
cout << '2' << endl;
}
vector<double> res;
for(auto val : array1) {
cout << val << '\t';
if (val != 0) res.push_back(val);
}
return res;
}
};