题目大意: X为距离 , 当0<X<=L1, 票价为C1。 L1<X<=L2 ,票价为C2。L2<X<=L3,票价为C3。给每段车站时间的距离,求某两个车站之间的总票价的最小值。
思路: 线性dp, 直接在for循环里判断就好了, dp[i] = min(dp[j]+cost, 0<=j<i)
AC CODE:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[10010];
int main(void) {
int l1, l2, l3;
while (cin >> l1 >> l2 >> l3) {
int c1, c2, c3;
cin >> c1 >> c2 >> c3;
int n, st, ed;
cin >> n >> st >> ed;
if (st > ed) swap(st, ed);
int arr[10010] = {0};
for (int i = 2; i <= n; i++) {
cin >> arr[i];
}
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[st] = 0;
//dp[i] = min(dp[j]+cost, 0<=j<i)
for (int i = st; i < ed; i++) {
for (int j = i+1; j <= n; j++) {
if (arr[j] - arr[i] > l3) continue;
if (arr[j] - arr[i] > l2) dp[j] = min(dp[j], dp[i] + c3);
else if (arr[j]-arr[i] > l1) dp[j] = min(dp[j], dp[i] + c2);
else dp[j] = min(dp[i] + c1, dp[j]);
// cout << "--" << dp[j] << endl;
}
}
cout << dp[ed] << endl;
}
return 0;
}