动态规划
一般解决问题的步骤:
- 表示状态
- 找出状态转移方程
- 边界处理
表示状态
分析最后一个阶段的状态即可,动态规划根据阶段的递进得出题解,最终答案就是在最后一个阶段
状态转移方程
找出阶段递进的规律,分析最后一个阶段,他的状态是如何得到的
边界处理
将题目条件分析出一开始的状态,并通过规则进行限制
Exampl
掷骰子
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例:
输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
class Solution {
public double[] dicesProbability(int n) {
int[] dp = new int[6*n+1];
for(int i = 1; i<=6 ;i++){
dp[i] = 1;
}
for(int i = 2 ;i <= n; i++){
for(int k = 6 * i; k >= i ; k--){
dp[k] = 0;
for(int j = 1; j <= 6 ;j++){
if(k-j < i-1 ) break;
dp[k] += dp[k - j];
}
}
}
double sum = Math.pow(6,n);
double[] res = new double[5*n+1];
int index = 0;
for(int i = n;i<=6*n; i++){
res[index] = dp[i]/sum;
index++;
}
return res;
}
}