十分钟找出递推关系式,10分钟wa我可真是个憨憨 ,状态转移其实蛮明显的,
记dp[i]
为从a到第i个车站的最小花费
从起始位置a开始不断向前寻找,每次前向找到所有 的车站,更新到达他们的最小花费–还是看代码比较清晰
- 注意,起点是a终点是b,别用1做起点N做终点。
- 没有告知N的大小就很坑,使用vector比较保险。
#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
#define ll int
#define MAX 1000005
#define inf 0x3fffff
#define mod 10000
int main() {
ll l1, l2, l3, c1, c2, c3, a, b, n;
while (cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3) {
cin >> a >> b >> n;
vector<ll> v(n + 1), dp(n + 1);
for (int i = 2; i <= n; i++)cin >> v[i], dp[i] = inf;
dp[a] = 0;
for (int i = a; i < n; i++) {
//从i车站开始
for (int j = i + 1; j <= n && v[j] - v[i] <= l3; j++) {
if (v[j] - v[i] <= l1) { if (dp[i] + c1 < dp[j])dp[j] = dp[i] + c1; }
else if (v[j] - v[i] <= l2) { if (dp[i] + c2 < dp[j])dp[j] = dp[i] + c2; }
else if (v[j] - v[i] <= l3) { if (dp[i] + c3 < dp[j])dp[j] = dp[i] + c3; }
}
}
cout << dp[b] << endl;
}
}