当前位置: 首页 > 后端技术 > Java

JZ-074-n个骰子的点数

时间:2023-04-02 00:27:21 Java

n个骰子的点数TopicDescription将n个骰子放在地上,求点数之和为s的概率。题目链接:【n个骰子的点数】()codeimportjava.util.AbstractMap;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;/***题目:n个骰子的个数ofpoints*将n个骰子放在地上,求点数之和为s的概率。*/publicclassJz74{/***动态规划*用一个二维数组dp存储点出现的次数,其中dp[i][j]表示第i个骰子产生点j的次数.*空间复杂度:O(N2)**@param*@return*/publicList>dicesSum(intn){finalintface=6;finalintpointNum=face*n;long[][]dp=newlong[n+1][pointNum+1];for(inti=1;i<=face;i++)dp[1][i]=1;for(inti=2;i<=n;i++)for(intj=i;j<=pointNum;j++)/*使用i骰子最小点i*/for(intk=1;k<=face&&k<=j;k++)dp[i][j]+=dp[i-1][j-k];finaldoubletotalNum=Math.pow(6,n);List>ret=newArrayList<>();对于(inti=n;i<=pointNum;i++)ret。add(newAbstractMap.SimpleEntry<>(i,dp[n][i]/totalNum));返还;}/***动态规划+旋转数组*空间复杂度:O(N)**@paramn*@return*/publicList>dicesSum2(intn){finalintface=6;finalintpointNum=face*n;long[][]dp=newlong[2][pointNum+1];for(inti=1;i<=face;i++)dp[0][i]=1;int标志=1;/*旋转标记*/for(inti=2;i<=n;i++,flag=1-flag){for(intj=0;j<=pointNum;j++)dp[flag][j]=0;/*旋转数组清零*/for(intj=i;j<=pointNum;j++)for(intk=1;k<=face&&k<=j;k++)dp[flag][j]+=dp[1-标志][j-k];}finaldoubletotalNum=Math.pow(6,n);List>ret=newArrayList<>();for(inti=n;i<=pointNum;i++)ret.add(newAbstractMap.SimpleEntry<>(i,dp[1-flag][i]/totalNum));返还;}公开cstaticvoidmain(String[]args){}}【每日留言】