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