Leetcode-动态规划-玩游戏

174. 地下城游戏

 

514. 自由之路 -- 难

 

787. K 站中转内最便宜的航班 -- 好难啊

import java.util.*;
class Solution {

    int src, dst;
    // key是终点,val是[起点,权重]
    HashMap<Integer, List<int[]>> indegree;
    int[][] memo;

    //给你一幅加权有向图,让你求 src 到 dst 权重最小的一条路径,
    //同时要满足,这条路径最多不能超过 K + 1 条边(经过 K 个节点相当于经过 K + 1 条边。
    public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
        k++;
        this.src = src;
        this.dst = dst;
        memo = new int[n][k+1];
        for (int[] row : memo) {
            Arrays.fill(row, -888);
        }
        indegree = new HashMap<>();
        for(int []f : flights){
            int from = f[0];
            int to = f[1];
            int price = f[2];
            // 记录谁指向该节点,以及之间的权重
            indegree.putIfAbsent(to, new LinkedList<>());
            indegree.get(to).add(new int[] {from, price});
        }
        return dp(dst,k);
    }

    // 定义:从 src 出发,k 步之内到达 s 的最小成本
    int dp(int s, int k) {
        // base case
        if(s == src) return 0;
        if(k == 0) return -1;
        // 备忘录
        if(memo[s][k] != -888) return memo[s][k];

        // 初始化为最大值,方便等会取最小值
        int res = Integer.MAX_VALUE;
        if (indegree.containsKey(s)) {
            // 当 s 有入度节点时,分解为子问题
            for (int[] v : indegree.get(s)) {
                int from = v[0];
                int price = v[1];
                // 从 src 到达相邻的入度节点所需的最短路径权重
                int subProblem = dp(from, k - 1);
                // 跳过无解的情况
                if (subProblem != -1) {
                    res = Math.min(res, subProblem + price);
                }
            }
        }
        memo[s][k] = res == Integer.MAX_VALUE ? -1 : res;
        // 如果还是初始值,说明此节点不可达
        return res == Integer.MAX_VALUE ? -1 : res;
    }
}

10. 正则表达式匹配

 

887.鸡蛋掉落(困难)

312.戳气球(困难)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值