• 【LeetCode双周赛34】5494. 统计所有可行路径


    5494. 统计所有可行路径

    给你一个 互不相同 的整数数组,其中 (locations[i]) 表示第 (i) 个城市的位置。同时给你 (start)(finish)(fuel) 分别表示出发城市、目的地城市和你初始拥有的汽油总量

    每一步中,如果你在城市 (i) ,你可以选择任意一个城市 (j) ,满足 (j eq i)(0 le j < locations.length) ,并移动到城市 (j) 。从城市 (i) 移动到 (j) 消耗的汽油量为 (|locations[i] - locations[j]|)(|x|) 表示 (x) 的绝对值。

    请注意, (fuel) 任何时刻都 不能 为负,且你 可以 经过任意城市超过一次(包括 (start)(finish) )。

    请你返回从 (start)(finish) 所有可能路径的数目。

    由于答案可能很大, 请将它对 (10^9 + 7) 取余后返回。

    (2 le locations.length le 100)
    (1 le locations[i] le 10^9)
    所有 (locations) 中的整数 互不相同 。
    (0 le start, finish < locations.length)
    (1 le fuel le 200)

    (DPDPDPDP)

    我怎么就不会DP呢

    (dp[i][k]) 定义为从起点到 (i) 正好花费燃料 (k) 的路径数目

    [dp[i][k + abs(loc[i]-loc[j])] += dp[j][k] ]

    class Solution {
    public:
        int countRoutes(vector<int>& loc, int start, int finish, int fuel) {
            int dp[110][220] = {0};
            int mod = 1e9+7;
            dp[start][0] = 1;
            int n = loc.size();
    
            for(int k = 0;k <= fuel;k++){
                for(int i = 0;i < n;i++){
                    for(int j = 0;j < n;j++){
                        if(i == j)continue;
                        if(k + abs(loc[i]-loc[j]) > 200)continue;
                        dp[i][k + abs(loc[i]-loc[j])] += dp[j][k];
                        dp[i][k + abs(loc[i]-loc[j])] %= mod;
                    }
                }
            }
    
            int ans = 0;
    
            for(int i = 0;i <= fuel;i++){
                ans = (ans + dp[finish][i]) % mod;
            }
    
            return ans;
        }
    };
    
  • 相关阅读:
    Linux命令学习Day1
    谈谈VAssitX Snippet
    Visual Studio sort函数出现“invalid operator<”原因分析
    网络打印机共享设置
    Notepad++使用总结
    Leetcode顺时钟旋转90度
    搭建Docker版gitlab私有云
    获取安卓APP设备上报信息
    中间件服务测试点整理
    Jenkins主从模式添加节点机
  • 原文地址:https://www.cnblogs.com/sduwh/p/13620774.html
Copyright © 2020-2023  润新知