动态规划入门(一)

149 阅读1分钟

题数:3

题目类型:动态规划

1.斐波那契数列

可以参考下面的博客的第一题(包括最简单的递归和dp还有官方的矩阵快速幂解法)

剑指offer day1 - 掘金 (juejin.cn)

2.使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

这里贴上代码(c语言):

int min(int a,int b){
    return a>b?b:a;
}

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

3.最大子数组和

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

这里可以发现他们的状态转移方程都是相似的

int maxn(int a,int b){
    return a>b?a:b;
}

int maxSubArray(int* nums, int numsSize){
    int dp[100001];
    dp[0]=nums[0];
    int max=nums[0];
    int i;
    for(i=1;i<numsSize;i++){
        dp[i]=maxn(dp[i-1]+nums[i],nums[i]);
        max=maxn(max,dp[i]);
    }
    return max;
}

总结

解题步骤

设计状态

设计/求解出状态转移方程

设定初始状态

执行状态转移

返回最终的解