初学动态规划
知识部分
(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。 (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态 图1 动态规划决策过程示意图
(1)分析最优解的性质,并刻画其结构特征。 (2)递归的定义最优解。 (3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值 (4)根据计算最优值时得到的信息,构造问题的最优解
我的理解
有关动态规划,分段求最优解是一个重点。
-《基本构成》 分段最优
- 用变量描述状态
- 决策
- 状态转移方程
-( 状态转移方程说白了就是从这一阶段到下一阶段的演变规律)
《使用》
需要数组赋予含义
可以用枚举的方法
把数组赋予含义去完成一个个最优子问题的思路是重点,要理解。
方法有搜索。记忆化搜索。顺推,逆推。
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return solutionFibonacci(n-1)+solutionFibonacci(n-2);
}
public static int solutionFibonacci(int n){
if(n==0){
return 0;
}else if(n == 1){
return 1;
}else{
int result[] = new int[n+1];
result[0] = 0;
result[1] = 1;
for(int i=2;i<=n;i++){
result[i] = result[i-1] + result[i-2];
}
return result[n];
}
```以上是斐波那契额的一个例子
从中可以看到
在递归的动态理解中用一个数组来保存
和金币的那个题有类似之处
但是金币题目在数学的角度上只能右下移动
所以右下递交处的金币最多从1.1到i,j金币数不会超过i+j
所以动态规划还是有一点贪心的意思
对了,如果问题没法分段优化,就不能用动态规划了。递归和贪心或许是更好的选择。