f[i]表示从起点到第i个车站的最小费用
f[i] = min(f[j] + dist(i, j)), j < i
动规中设置起点为0,其他为正无穷
(貌似不用开long long也可以)
#include#include #define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;typedef long long ll;const int MAXN = 112;ll a[MAXN], l[4], c[4], f[MAXN];int n, s, e;ll dist(ll n, ll m){ ll x = a[m] - a[n]; if(0 < x && x <= l[1]) return c[1]; if(l[1] < x && x <= l[2]) return c[2]; if(l[2] < x && x <= l[3]) return c[3]; return 2e9;}int main(){ REP(i, 1, 4) scanf("%lld", &l[i]); REP(i, 1, 4) scanf("%lld", &c[i]); scanf("%d%d%d", &n, &s, &e); if(s > e) swap(s, e); REP(i, 2, n + 1) scanf("%d", &a[i]), f[i] = 2e9; f[s] = 0; REP(i, s, e + 1) REP(j, s, i) f[i] = min(f[i], f[j] + dist(j, i)); printf("%lld\n", f[e]); return 0;}