class Solution {
public:
vector<double> twoSum(int n) {
vector<vector<int>>dp(n+1,vector<int>(6*n+1,0));
vector<double>ans;
for(int i=1;i<7;++i)
dp[1][i]=1;
for(int i=2;i<=n;++i)
{
for(int j=2;j<=6*i;++j)
{
for(int k=1;k<j&&k<7;++k)
{
dp[i][j]+=dp[i-1][j-k];
}
}
}
int sum=0;
for(auto c:dp[n])
{
sum+=c;
}
for(auto c:dp[n])
{
if(c!=0)
ans.push_back(c*1.0/sum);
}
return ans;
}
};
总结:比较典型的动态规划问题,首先确定状态,然后写出状态转移方程,最后就可以写出代码了。组合问题,优化问题,要多考虑动态规划的思想,首先由递归入手(从上到下),如何减小问题规模,或者将问题的解分为多种情况。然后反过来从下到上就是动态规划。