【动态规划基础1】

LC题1

题目描述:509. 斐波那契数
给定一个非负整数n(0<=n<=30),求斐波那契数列的第n项。

(1) 斐波那契数列,f[0]=0,f[1]=1,f[n]=f[n-1]+f[n-2]。
(2)递推,核心是递推式:f[n]=f[n-1]+f[n-2]

int f[1000];
int fib(int n){
f[0]=0;f[1]=1;
for(int i=2;i<=n;i++){
    f[i]=f[i-1]+f[i-2];
}
return f[n];
}

LC题2

题目描述:70. 爬楼梯
给定一个n ( 1 <= n <= 45),代表总共有n阶楼梯。一开始在第0阶,每次可以爬1或者2个台阶,问总共有多少种不同的方法可以爬到楼顶。

(1)f[i]表示从第 0 阶爬到第 i 阶的方案数
(2)走到第 i 阶,是从i - 1或者i - 2开始走
(3)最后,状态转移:f[i]=f[i-1]+f[i-2];
(4)初始状态:f[0]代表从第0阶到第0阶的方案数,f[1]代表从第0阶到第1阶的方案数

int climbStairs(int n){
    int i;
    int f[48] = {1,1};
    for(i = 2; i <= n; i++){
        f[i] = f[i - 1] + f[i - 2];
    }
    return f[n];
}

LC题3

题目描述:746. 使用最小花费爬楼梯

(1)将爬楼梯的计算方案数改为计算最小值
(2)f[i]表示爬到第i层的最小花费
(3)如果从i - 1爬到i的位置,花费:f[i - 1] + cost[i - 1];
         如果从i - 2爬到i的位置,花费:f[i - 2] + cost[i - 2];
(4)状态转移方程:f[i] = min (f[i - 1]+cost[i - 1] , f[i - 2]+cost[i - 2]);
(5)初始状态:f[0] = 0 , f[1] = 0;

int min(int a,int b){
    return a < b ? a : b;
}
int minCostClimbingStairs(int* cost, int n){
    int i;
    int f[1001] = {0,0};
    for(i = 2; i <= n; i++){
        f[i] = min (f[i - 1]+cost[i - 1] , f[i - 2]+cost[i - 2]);
    }
    return f[n];
}

总结:通过简单题可以总结出来 动态规划题的大致流程
(1)设计状态
(2)写出状态转移方程
(3)设置初始状态
(4)执行状态转移
(5)返回最终的解

LC题进阶题4

题目描述:53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

(1)dp[i]表示以第i个整数结尾的子数组中的最大值
(2)和第i-1个整数结尾的子数组相连
(3)和第i-1个整数结尾的子数组不想连(单独以第i个整数作为子数组)

int max(int a, int b){
    return a > b ? a : b;
}
int maxSubArray(int* nums, int n){
    int i;
    int dp[100001];
    int maxValue = nums[0];
    dp[0] = nums[0];
    for(i = 1; i < n; i++){
        dp[i] = max(dp[i-1] +nums[i] , nums[i]);
        maxValue = max(maxValue, dp[i]);
    }
    return maxValue;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值