Leetcode——70爬楼梯、120三角形的最小路径和

动态规划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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值