第一题
解题思路:
状态定义:设dp为一维数组,其中dp[i]的值代表斐波那契第i个数字
转移方程:dp[i+1]=dp[i]+dp[i-1],即对应数列定义f(n+1)=f(n)+f(n-1)
初始状态:dp[0]=0,dp[1]=1,即初始化前两个数字
返回值:dp[n],即斐波那契数列的第n个数字
代码实现:
class Solution {
public int fib(int n) {
int a=0,b=1,sum;
for(int i=0;i<n;i++){
sum=(a+b)%1000000007;
a=b;
b=sum;
}
return a;
}
}
第二题
解题思路:
n-1个台阶有f(n-1)种跳法,最后还剩一个台阶,最后青蛙只能最后一跳
n-2个台阶有f(n-2)种跳法,最后剩余二个台阶,有两种跳法:
①一次跳两个台阶
②一次跳一个台阶 但是这种跳法其实已经在n-1个台阶里包含了,所以
f(n)=f(n-1)+f(n-2)
代码实现:
class Solution {
public int numWays(int n) {
int a=1,b=1,sum;
for(int i=0;i<n;i++){
sum=(a+b)%1000000007;
a=b;
b=sum;
}
return a;
}
}
第三题
代码实现:
初始状态:首日利润为0
状态转移:记录最低价格cost,此时买入
记录利润,如果price-cost>profit,则转移;否则,不转移
解题思路:
class Solution {
public int maxProfit(int[] prices) {
int cost=Integer.MAX_VALUE,profit=0;
for(int price:prices){
cost=Math.min(cost,price);
profit=Math.max(profit,price-cost);
}
return profit;
}
}