动态规划

一般解决问题的步骤:

  1. 表示状态
  2. 找出状态转移方程
  3. 边界处理

表示状态

分析最后一个阶段的状态即可,动态规划根据阶段的递进得出题解,最终答案就是在最后一个阶段

状态转移方程

找出阶段递进的规律,分析最后一个阶段,他的状态是如何得到的

边界处理

将题目条件分析出一开始的状态,并通过规则进行限制

Exampl

掷骰子

  1. n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
  2. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例:
  3. 输入: 2
  4. 输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
  1. class Solution {
  2. public double[] dicesProbability(int n) {
  3. int[] dp = new int[6*n+1];
  4. for(int i = 1; i<=6 ;i++){
  5. dp[i] = 1;
  6. }
  7. for(int i = 2 ;i <= n; i++){
  8. for(int k = 6 * i; k >= i ; k--){
  9. dp[k] = 0;
  10. for(int j = 1; j <= 6 ;j++){
  11. if(k-j < i-1 ) break;
  12. dp[k] += dp[k - j];
  13. }
  14. }
  15. }
  16. double sum = Math.pow(6,n);
  17. double[] res = new double[5*n+1];
  18. int index = 0;
  19. for(int i = n;i<=6*n; i++){
  20. res[index] = dp[i]/sum;
  21. index++;
  22. }
  23. return res;
  24. }
  25. }