题数:3
题目类型:动态规划
1.斐波那契数列
可以参考下面的博客的第一题(包括最简单的递归和dp还有官方的矩阵快速幂解法)
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;
}