标签:style blog http color strong 2014
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; }
POJ 2355 Railway tickets (线性dp),码迷,mamicode.com
POJ 2355 Railway tickets (线性dp)
标签:style blog http color strong 2014
原文地址:http://blog.csdn.net/bolininahuaalex/article/details/24798313