【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;
}
};