关键词:动态规划 滚动数组优化
这道题还是不难的,就是特别纠结要怎么优化这个存储空间以及动态规划的方法,因为我觉得这个方法好原始,最后决定不优化了。最后发现题解也是这个原始的样子,我就放心了。用时38min。
题目:
思路:
类似跳楼梯,一次可以跳1-6级。
dp状态:
dp[i][j]:第i次抛筛子,第j小的点数集合的概率。
转移方程:
dp[i][j]=(dp[i-1][j-1]+dp[i-1][j-2]+...+dp[i-1][j-6])*(1/6)【这里注意范围】
i-1次抛筛子的集合点数的概率*1/6
初始化:第一次抛骰子,所有点数的概率都是1/6
复杂度计算:
时间复杂度O(n^2)
空间复杂度O(n)
代码:
我的dp状态的长度是num*6+1,因为想要dp的索引对应点数的集合。
抛第i次的时候,最大的点数集合是i*6,最小的点数集合是i。
cpp
class Solution {
public:
vector<double> statisticsProbability(int num) {
vector<double> dp(6*num+1,1.0/6);
dp[0]=0;
for(int i=2;i<=num;++i)
{
for(int j=i*6;j>=i;--j)
{
dp[j]=0;
for(int z=1;z<=6;++z)
{
if(j-z>=i-1&&j-z<=(i-1)*6)//从上一轮里面选
dp[j]+=dp[j-z];
}
dp[j]*=1.0/6;
}
}
vector<double> res(num*5+1);
int j=0;
for(int i=num;i<=num*6;++i,++j)
{
res[j]=dp[i];
}
return res;
}
};