第 i 个骰子的结果为 1,有 f[i][j]=f[i−1][j−1]
第 i 个骰子的结果为 2,有 f[i][j]=f[i−1][j−2]
...
第 ii 个骰子的结果为 m,有 f[i][j]=f[i−1][j−m]
f[i][j]f[i][j] 则是上述所有可能方案的方案数总和,即有:
f[i][j]=∑k=1mf[i−1][j−k],j>=k
代码演示
classSolution{int mod =(int)1e9+7;publicintnumRollsToTarget(int n,int m,int t){int[][] dp =newint[n +1][t +1];
dp[0][0]=1;//骰子可以选的次数for(int i =1; i <= n;i++){//需要凑够的点数大小for(int j =0; j <= t;j++){//枚举所有的点数.for(int k =1;k <= m;k++){if(j >= k){
dp[i][j]=(dp[i][j]+ dp[i -1][j - k])% mod;}}}}return dp[n][t];}}
空间压缩
classSolution{int mod =(int)1e9+7;publicintnumRollsToTarget(int n,int m,int t){int[] f =newint[t +1];
f[0]=1;for(int i =1; i <= n; i++){for(int j = t; j >=0; j--){
f[j]=0;for(int k =1; k <= m; k++){if(j >= k){
f[j]=(f[j]+ f[j-k])% mod;}}}}return f[t];}}