一些静态模型,只要人为引入“时间”因素,就可以转化为多阶段动态模型,用动态规划处理。
最优化原理(principle of optimality):一个最优策略的子策略,对于它的初态和终态必然是最优的
例:斐波那契数列 递归方法可以很容易求得,但是效率低下,因为其子状态被重复计算。可以把已经计算过的值记录下来,避免重复计算。
package preDP;
public class Fibonacci {
public static int mod = 1000000007;
public static int[] a = new int[100001];
public static int f(int x) {
if (a[x] != 0) {
return a[x];
}
if (x <= 2) {
return a[x] = 1;
} else {
return a[x] = (f(x - 1) + f(x - 2)) % mod;
}
}
public static void main(String[] args) {
System.out.println(f(100));
}
}
该程序为使用记忆式计算的斐波那契数列。
程序解析: 1 int mod = 1000007 对于大整数阶乘或排列组合可以通过对1000000007取模(中间8个0)。在大数相乘的时候 因为(a?b)%c=((a%c)?(b%c))%c 所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出
2通过建立一个大数组,利用数组保存重复状态的计算结果,避免重复计算。
3状态转移方程:f[i] = f[i - 1] + f[i - 2] i >= 3
4任何一个状态只和确定的前几项直接相关
|