数据结构和算法

动态规划

  1. 如何确定本题可以使用动态规划来解的?
    只关注状态的值,而不需要关注状态是如何转移过来的话。
  2. 如何确定本题的状态定义?
    虽然大多数情况都是猜的,但也不是毫无规律,相当一部分题目的状态定义是与「结尾」或「答案」有所关联的。
  3. 如何确定状态转移方程?
    如果我们的状态定义猜对了,状态转移方程就是对「最后一步的分情况讨论」
  4. 对状态转移的要求是什么?
    如果是求最值的话,我们只需要确保「不漏」即可,因为重复不影响结果。
    如果是求方案数的话,我们需要确保「不重不漏」。
  5. 如何分析动态规划的时间复杂度?
    有多少个状态,复杂度/计算量就是多少。

N人过河问题

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 读取人数
        int[] nums = new int[n+1];
        Arrays.sort(nums);
        for (int i = 1; i <= n; i++) {
            nums[i] = sc.nextInt();
        }
        int result = 0;
        int stay = n;
     	//大于三人
        while(stay > 3){
            //判断方案一快还是方案二,这里不等式化简了,自己写一下就知道了。
            if(nums[1] + nums[stay-1] > 2*nums[2]) {
                // 第二种方案
                result += 2*nums[2] + nums[stay] + nums[1];
            } else {
                // 第一种方案
                result += 2*nums[1] + nums[stay] + nums[stay-1];
            }
            //过桥了两人
            stay -= 2;
        }
     
        if (stay == 3){
            result += (nums[1] + nums[2] + nums[3]);
        } else {
            result += (nums[2]);
        }
        System.out.println("最短时间: " + result);
    }

DFS

  1. 设计好递归函数的「入参」和「出参」
  2. 设置好递归函数的出口(Base Case)
  3. 编写「最小单元」处理逻辑

记忆化搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值