AcWing 80. 骰子的点数-java逐行注解
原题链接
简单
作者:
ajiangplus
,
2019-08-19 00:31:58
,
所有人可见
,
阅读 1284
算法1
java 代码
class Solution {
public static int[] numberOfDice(int n) {
if (n <= 0) return new int[]{}; //无意义的输入,输出空数组
int index = 0; //方便保存n次掷骰子的结果
int[] res = new int[5 * n + 1]; //用来保存最终结果
int[][] arr = new int[n + 1][6 * n + 1]; //arr[i][j]:投掷i次其点数之和为j的可能情况
arr[0][0] = 1; //初始值,为了计算出arr[1][1]
for (int i = 1; i <= n; i++)//状态转移方程,为了计算第n次的结果,需要依次求前面1 - n-1的结果
{
if (i == n) { //加这样一个判断是为了直接保存投掷n次的结果到res
for (int j = i; j <= 6 * i; j++)//注意j的范围受i影响
{
for(int k = 1; k <= Math.min(j, 6); k ++)
arr[i][j] += arr[i-1][j - k];
res[index++] = arr[i][j];
}
} else { //前面的 n - 1次是为第n次做铺垫,结果不需要同步到res中
for (int j = i; j <= 6 * i; j++)//注意j的范围受i影响
{ //n次结果和n-1有关,f[i][j]=f[i-1][j-1]+f[i-1][j-2]+f[i-1][j-3]+f[i-1][j-4]+f[i-1][j-5]+f[i-1][j-6]
for(int k = 1; k <= Math.min(j, 6); k ++)//当点数和j>6时,第n次的骰子点数至多六种可能性,
arr[i][j] += arr[i-1][j - k];
}
}
}
return res;
}
}