#include <climits> #include <iostream> #include <vector> using namespace std; vector<int> dis; int main() { //处理一下输入,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3 //dis[i]代表第i个车站距离第一个车站的距离,那么显然dis[0]随意赋值 //dis[1]=1,剩下的话依据题意输入即可 int l1, l2, l3, c1, c2, c3; while (cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3) { dis.clear(); dis.push_back(-1); dis.push_back(0); //start和end是起始站和终点站 int start, end; cin >> start >> end; int N;//火车站数量 cin >> N; int dp[N + 1][N + 1]; //dp[i][j]表示第i个车站出发去第j个车站的最小花费 for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { dp[i][j] = INT_MAX; //因为我们后面要取小值,所以初始化尽量最大 } } for (int i = 1; i <= N; i++) { dp[i][i] = 0; //注意一下从i车站出发去i车站的话,最小花费应该是0 } int x; int num = N - 1; //输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。 while (num--) { cin >> x; dis.push_back(x); } for (int i = 1; i <= N; i++) { for (int j = i + 1; j <= N; j++) { int d = dis[j]; int k = j - 1; int c = k; //依次比较上一趟应该买三种中的哪一种(前提是要能买) while (d - dis[k] <= l1 && k >= i) { dp[i][j] = min(dp[i][j], dp[i][k] + c1); k--; } k = c; while (d - dis[k] <= l2 && k >= i) { dp[i][j] = min(dp[i][j], dp[i][k] + c2); k--; } k = c; while (d - dis[k] <= l3 && k >= i) { dp[i][j] = min(dp[i][j], dp[i][k] + c3); k--; } } } cout << dp[start][end] << endl; } } // 64 位输出请用 printf("%lld")