动态规划算法Dynamic Programming

/**

 *  动态规划算法

 

 Dynamic Programming = Divide and Conquer + Memoization

 

 动态规划是分治法的延伸。当递归分割出来的问题,一而再、再而三出现,就运用记忆法储存这些问题的答案,避免重复求解,以空间换取时间。

 

 动态规划的过程,就是反覆地读取数据、计算数据、储存数据。

 

 1: 动态规划算法一般用来求解最优化问题,当问题有很多可行解,而题目要求寻找这些解当中的最大值”/“最小值时,

  通常可以采用DP

 2: 动态规划算法与分治法相似,都是通过组合子问题的解来求解原问题。

    所不同的是,动态规划应用于子问题重叠的情况,

    在递归求解子问题的时候,一些子子问题可能是相同的,这种情况下,分治法会反复地计算同样的子问题,

    而动态规划对于相同的子问题只计算一次。

 

 

 动态规划算法的设计步骤:

 1、刻画最优解的结构特征(寻找最优子结构)

 2、递归地定义最优解的值(确定递归公式)

 3、计算最优解的值(有两种方法:带备忘录自顶向下法、自底向上法)

 4、利用计算出的信息构造一个最优解(通常是将具体的最优解输出)

 */


                                                      



eg1: 阶乘

/* 范例:阶乘( Factorial

 

 1 × 2 × 3 × ⋯ × N 。整数 1 N 的连乘积。 N阶乘。 N!

 

 N! 源自 (N-1)!,如此就递归分割问题了。

 

 

 阵列的每一格对应每一个问题。设定第一格的答案,再以递归依序计算其馀答案。

 

 

 时间复杂度分析:总共 N个问题,每个问题花费 O(1) 时间,总共花费 O(N)时间。

 

 空间複杂度分析,有两种情况:

 

  1! N! :总共 N个问题,用一条 N 格阵列储存全部问题的答案,空间複杂度为 O(N)

 

 只求 N!:用一个变数累计乘积,空间複杂度为 O(1)


*/


const int N = 10;
int f[N];

void
factorial(){
    f[0] = 0;
    f[1] = 1;
    for (int i = 2; i<= N; ++i) {
        f[i] = f[i-1] * i;
    }
}

void
test_pactorial(){
    factorial();
    printf("f[9]=%d",f[9]);
}




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值