1189. 【动态规划】最小乘车费用

文章介绍了一种算法,用于解决在公共汽车系统中,乘客如何通过多次换车以达到指定公里数n时,使总费用最小的问题。给定不同距离的乘车费用,程序计算出最小费用的乘车策略。
题目描述

假设某条街上每一公里就有一个公共汽车站,并且乘车费用如下表:
公里数 1    2   3    4   5   6   7    8    9   10
费   用 12  21 31 40 49 58  69  79  90 101
而任意一辆汽车从不行驶超过10公里。某人想行驶n公里,假设他可以任意次换 车,请你帮他找到一种乘车方案,使得总费用最小
注意:10公里的费用比1公里小的情况是允许的。

输入

共两行,第一行为10个不超过150的整数,依次表示行驶1~10公里的费用,相邻两数间用空格隔开;第二行为某人想要行驶的公里数,保证不超过100。

输出

仅一行包含一个整数,表示该测试点的最小费用。

样例输入
12  21  31  40  49  58  69  79  90  101 
15 
样例输出
147

代码:

#include<iostream>
using namespace std;
int a[11],f[110];
int main()
{
	int n;
	for(int i=1;i<=10;i++)
	{
		cin>>a[i];
	}
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		f[i]=f[i-1]+a[1];
	    for(int j=2;j<=i,j<=10;j++)
	    {
	    	f[i]=min(f[i],f[i-j]+a[j]);
		}   
	}   
	cout<<f[n];
	return 0;
}
### 关于最小乘车费用问题的线性动态规划解决方案 #### 1. 定义状态变量 为了构建一个有效的动态规划模型,首先定义状态变量 `dp[i]` 表示从起点到第 `i` 站所需的最少费用。这里假设每站之间的票价由给定的成本矩阵或固定费率决定。 #### 2. 初始条件设定 初始条件通常设为起始站点的花费为零,即 `dp[start_station] = 0`[^1]。这是因为在出发点不需要支付任何额外费用即可开始旅程。 #### 3. 转移方程设计 根据引用中的递推思想[^3],可以建立如下状态转移方程: 对于每一个可能到达当前车站的方式(从前一站直达或者跳过若干站),计算其累计最低费用: ```python for j in range(1, n): dp[j] = min(dp[j], dp[k] + cost(k,j)) for k in predecessors(j) ``` 其中 `cost(k,j)` 是从k站移动至j站所需的具体费用;而`predecessors(j)`则代表所有可以直接抵达j站之前的所有潜在上一站位置集合。 此公式体现了通过比较不同路径累积成本来找到最佳选项的核心理念,并且遵循了线性的处理顺序——按照车站序列逐步更新各节点的最佳值直至终点。 #### 4. 边界情况考虑 需特别注意某些特殊情况下的边界处理,例如当某两站之间不存在直接连通关系时如何赋极大值表示不可达等情况。这有助于确保最终得出的结果始终有效合理。 #### Python 实现示意代码 以下是上述逻辑的一个简单Python实现版本: ```python def min_cost(n, edges_with_costs): INF = float('inf') # Initialize DP array with infinity values except start point which is zero. dp = [INF]*n dp[0]=0 # Process each edge and update the minimum costs accordingly. for _ in range(n-1): # Relax all edges up to N-1 times as per Bellman-Ford algorithm principle. updated=False for u,v,w in edges_with_costs: if dp[u]!=INF and dp[v]>dp[u]+w : dp[v]=dp[u]+w updated=True if not updated: break return dp[-1] # Example usage of function where 'edges_with_costs' contains tuples (u,v,cost). print(min_cost(number_of_stations, list_of_edges_and_their_respective_costs)) ``` 以上程序片段展示了利用Bellman-Ford算法框架解决该类单源最短路问题的方法之一,在实际应用过程中可根据具体场景调整细节部分如数据结构选用等以提高效率性能等方面表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值