动态规划(一)斐波那契函数

本文深入探讨了斐波那契数列的求解方法,首先介绍了经典的递归方法及其存在的时间复杂度过高的问题,随后提出了使用动态规划进行优化的解决方案,最后通过一个实际案例——名名吃巧克力的方案数目的问题,展示了动态规划方法在解决此类问题上的应用。

1、经典斐波那契函数求解(递推方法)

递推方程An = An-1 + An-2  

              A0 = 0

              A1 = 1

代码:

int Fibonacci(int n){
    if(n == 1 || n == 0){
        return n;
    }else{
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

问题:时间负复杂度太高有太多的重复计算,会导致时间复杂度为指数级

例如,求An时需要计算An-1 和An-2, 求An-1时需要计算An-2 和An-3。。。

解决,将重复计算用数组dp存储起来用的时候直接拿出来。

2、动态规划方法求解斐波那契函数

#include <iostream>
#include <cstdio>

using namespace std;

int dp[1000];  //用来存储重复的计算

int main(){
    dp[0] = 0;
    dp[1] = 1;   //边界
    int n;
    cin >> n;
    for(int i = 2; i <= n; i ++){
        dp[i] = dp[i - 1] + dp[i - 2];   //转换方程
    }
    cout << dp[n] << endl;
    return 0;
} 

3、实例演示(斐波那契函数的实例)

题目描述

名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。 妈妈告诉名名每天可以吃一块或者两块巧克力。 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案; 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案; 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案; 如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。 现在给定N,请你写程序求出名名吃巧克力的方案数目。

输入描述:

输入只有1行,即整数N。

输出描述:

可能有多组测试数据,对于每组数据,
输出只有1行,即名名吃巧克力的方案数。

示例1

输入

4

输出

5
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    int n;
    while(scanf("%d", &n) != EOF){
        int step[n + 1];
        step[1] = 1;
        step[2] = 2;
        for(int i = 3; i <= n; i ++){
            step[i] = step[i - 1] + step[i - 2];
        }
        cout << step[n] << endl;
    }
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值