首页 > 代码库 > POJ 2355 Railway tickets (线性dp)
POJ 2355 Railway tickets (线性dp)
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。