OJ题目 : click here~
题目分析:X为距离 , 当0<X<=L1, 票价为C1。 L1<X<=L2 ,票价为C2。L2<X<=L3,票价为C3。给每段车站时间的距离,求某两个车站之间的总票价的最小值。
设dp[ i ] 为到车站 i 的最少票价 。
则转移方程为dp[ i ] = min(dp[ j ] + 从j 到 i 的票价),j 为所有可以直接到 i 的车站。
要注意第一个数字 大于 第二个数字的情况。的确,题目没有说,从a 到 b。只说了a,b之间。要仔细读题啊,不能想当然。
AC_CODE
const int Max_l = 10002;
const int inf = 1<<30;
int dist[Max_l];//dist[i] 表示车站i 与i - 1的距离
int d[Max_l];
int dp[Max_l];
int main(){
int L1 , L2 , L3 , C1 , C2 , C3 , n , m ,from , to , i , j , k;
while(cin >> L1 >> L2 >> L3 >> C1 >> C2 >> C3){
cin >> n >> from >> to;
if(from > to) swap(from , to);
dist[1] = 0;
d[1] = 0;
for(i = 2;i <= n;i++){
scanf("%d",&d[i]);
dist[i] = d[i] - d[i - 1];
}
for(i = 0;i <= n;i++)
dp[i] = inf;
dp[from] = 0;
for(i = from + 1;i <= to;i++){
int s = dist[i];
for(j = i - 1;s <= L3&&j >= from;s += dist[j],j--){//如果从j 到 i
if(0 < s && s <= L1) m = C1;
if(L1 < s && s <= L2) m = C2;
if(L2 < s && s <= L3) m = C3;
dp[i] = min(dp[i] , dp[j] + m);
}
}
cout << dp[to] << endl;
}
return 0;
}