动态规划Dynamic Programming
1,递推(递归+记忆)
2.状态的定义:opt[n],dp[n],fib[n]
3,状态转移方程:opt[n]=best_of(opt[n-1],opt[n-2],…)
4.最优子结构
DP vs 回溯 vs 贪心
回溯(递归) ——重复计算
贪心——永远局部最优
DP——记录局部最优子结构/多种记录值
70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
【实现代码】
package leetcode_50;
import java.util.Scanner;
public class Leetcode_70 {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int result,result2;
result=climbstairs(n);
result2=climbstairs2(n);
System.out.println(result2);
System.out.print(result);
}
private static int climbstairs2(int n) {
if(n<=2) return n;
int one_step_before=2;
int two_step_before=1;
int all_ways=0;
for(int j=2;j<n;j++){
all_ways=one_step_before+two_step_before;
two_step_before=one_step_before;
one_step_before=all_ways;
}
return all_ways;
}
private static int climbstairs(int n) {
if(n==0||n==1||n==2){
return n;
}
int[] mem=new int[n];
mem[0]=1;
mem[1]=2;
for(int i=2;i<n;i++){
mem[i]=mem[i-1]+mem[i-2];
}
return mem[n-1];
}
}
120.三角形的最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为11(即,2 + 3 + 5 + 1 = 11)。
【分析】
1.定义状态:dp[i,j]:是指从底走到i,j路径和的最小值。
2.方程;dp[i,j]=min(dp[i+1,j],dp[i+1,j+1])+本身这点的数据
3.初始状态:dp[m-1,j]=triangle[m-1.j]
【实现代码】
import java.util.ArrayList;
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int len=triangle.size();
if(len==0) return 0;
int[] dp=new int[triangle.size()];
for(int i=0;i<triangle.size();i++){
dp[i]=triangle.get(triangle.size()-1).get(i);
}
//从倒数第二层开始
for(int i=triangle.size()-2;i>=0;i--){
List<Integer> curlist=triangle.get(i);
for(int j