Loading

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

5494. 统计所有可行路径

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

每一步中,如果你在城市 \(i\) ,你可以选择任意一个城市 \(j\) ,满足 \(j \neq 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;
    }
};
posted @ 2020-09-06 09:45  —O0oO-  阅读(188)  评论(0编辑  收藏  举报