动态规划
class Solution {
public int fib(int n) {
if(n==0) return 0;
int dp0 = 0;
int dp1 = 1;
int tmp;
for(int i=2;i<=n;i++){
tmp = (dp0+dp1)%1000000007;
dp0 = dp1;
dp1 = tmp;
}
return dp1;
}
}
因为青蛙一次可以跳1或2,所以第n步是f(n-1),f(n-2)之和
可转为斐波拉契数组 不过初始条件是 f(1) = 1 f(2)=2
class Solution {
public int numWays(int n) {
if(n==0||n==1) return 1;
int dp1 = 1;
int dp2 = 2;
int tmp = dp2;
for(int i=3;i<=n;i++){
tmp = (dp1+dp2) % 1000000007;
dp1 = dp2;
dp2 = tmp;
}
return tmp;
}
}
前i日最大利润=max( 前(i?1)日最大利润 , 第i日价格?前i日最低价格 ) dp[i]=max( dp[i?1] , prices[i]?min(prices[0:i]) )
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;
}
}
|