【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;
    }
};
原文地址:https://www.cnblogs.com/sduwh/p/13620774.html