算法自学笔记:动态规划的基本思想和概念(1)记忆化优化递归程序

一些静态模型,只要人为引入“时间”因素,就可以转化为多阶段动态模型,用动态规划处理。

最优化原理(principle of optimality):一个最优策略的子策略,对于它的初态和终态必然是最优的

例:斐波那契数列
递归方法可以很容易求得,但是效率低下,因为其子状态被重复计算。可以把已经计算过的值记录下来,避免重复计算。

package preDP;

public class Fibonacci {

	public static int mod = 1000000007;	// use to in fractorial, permutation, combination of large numbers
	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) {
		// TODO Auto-generated method stub

		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任何一个状态只和确定的前几项直接相关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值