参考:如何理解动态规划?
三步问题
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
n范围在[1, 1000000]之间
public int waysToStep(int n) {
if (n <= 2) {
return n;
}
long MOD = 1000000007;
long[] dp = new long[n + 1];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++) {
dp[i] = (dp[i - 1] % MOD) + (dp[i - 2] % MOD) + (dp[i - 3] % MOD);
}
int res = (int) (dp[n] % MOD);
return res;
}
空间优化
public int waysToStep(int n) {
if (n <= 2) {
return n;
}
long MOD = 1000000007;
long dp1 = 1;
long dp2 = 2;
long dp3 = 4;
for (int i = 4; i <= n; i++) {
long temp = (dp1 + dp2 + dp3) % MOD;
dp1 = dp2;
dp2 = dp3;
dp3 = temp;
}
int res = (int) (dp3 % MOD);
return res;
}
最小路径和
牛逼牛逼:LEEDCode 最小路径和 求解
乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。