Travelling by Stagecoach

2023-11-05 23:20
文章标签 travelling stagecoach

本文主要是介绍Travelling by Stagecoach,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Travelling by Stagecoach(POJ No.2686)

有一个旅行家计划乘马旅行。他所在的国家共m个城市,在城市之间有若干道路相连。从某个城市沿着某条路到相邻的城市需要乘马。而乘马需要使用车票,每用一张车票只能通过一条道路。每张车票有马的匹数,从一个城市到另一个城市所需的时间等于城市之间的道路除以马的数量的结果,这位旅行家共有n张车票,第i张车票上的马的匹数是ti。一张车票只能使用一次,并且换乘所需时间忽略。求从城市a到城市b所需的最短时间。如果无法到达b则输出“Impossible”。


本题的思路与TSP相同
TSP:https://blog.csdn.net/qq_45769877/article/details/104336842

设dp[v][S]:表示在顶点v时,剩余的车票集合为S,到达终点的最短时间

在初始值上有所改变
dp[v][∅]=无穷 v≠终点
dp[v][∅]=0 v=终点

递归表达式
状态转移,是车票的递减
在这里插入图片描述
示例:
在这里插入图片描述
dp数组
在这里插入图片描述


直接上代码

#include<iostream>
#include<stdlib.h>
#include<algorithm>
#define MAX_N 100
#define INF 1000
using namespace std;int n = 4, m = 2, a = 1, b = 0;
double t[MAX_N] = { 1,3 };
double d[4][4] = { {0,INF,3,2},{INF,0,3,5},{3,3,0,INF},{2,5,INF,0} };
double dp[MAX_N][MAX_N];void DP() {//当车票剩余为0时,若v为终点则值为0,在其他点时则不可能到达终点,值为INFfor (int i = 0; i < n; i++) {if (i == b) dp[i][0] = 0;else dp[i][0] = INF;}//以列为准,进行跟新for (int S = 1; S < 1 << m; S++) {for (int i = 0; i < n; i++) {//当v刚好为终点时,则其值为0if (i == b) dp[i][S] = 0;else {//对其他点进行计算dp[i][S] = INF;for (int j = 0; j < n; j++) {//对当前点v相邻的点,进行筛选if (d[i][j] != INF) {//对车票进行筛选for (int k = 0; k < m; k++) {if (((S >> k) & 1) == 1) {dp[i][S] = min(dp[i][S], dp[j][S ^ (1 << k)] + d[i][j] / t[k]);}}}}}}}
}
int main() {DP();//这里直接打印了dp数组for (int i = 0; i < n; i++) {for (int j = 0; j < (1 << m); j++)if (dp[i][j] == INF) cout << "INF\t";else cout << dp[i][j]<<"\t";cout << endl;}system("pause");
}

这篇关于Travelling by Stagecoach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353107

相关文章

zoj 2027 Travelling Fee

题意:求从起点除法到终点的最少费用,题目比一般的最短路径多了个限制条件,可以免去花费最多的一条边的费用。 思路:用一个数组maxi[i][j]记录从i到j的路径中,一条路最多花费多少,将递推式改成 edge[i][j] = min (edge[i][k] + edge[k][j] - max(maxi[i][k],maxi[k][j]) , edge[i][j] - maxi[i][j])

hdu 3001 Travelling TSP变形 三进制状压dp

// hdu 3001 TSP问题的变形// 这次到每个点最多两次,所以可以用三进制的类推// dp[S][u]表示当前在u点访问状态为S时所得到的最小的开销// 采用刷表法,即用当前的状态推出它所能转移的状态// dp[S][u] 可以到达的状态为dp[S+state[v]][v](dist[u][v]!=inf)// dp[S+state[v]][v] = max(dp[S+stat

Codeforces 1009e Intercity Travelling

http://codeforces.com/problemset/problem/1009/E   把n从2到5的情况都列出来会发现n每次加1 就只是在最高位加一个数字 n=2 即1 3 n=3 即1 3 8 n=5 即1 3 8 20 48 规律就是cs[k]=cs[k-1]*3-(k-2)的前缀和     #include<map>#include<stack>#incl

旅行商问题(travelling salesman problem, TSP) 解题报告

旅行商问题是个熟知的问题。这次是因为coursera上面选的算法课而写代码实现。这里做个简单总结。 测试程序: 25 20833.3333 17100.0000 20900.0000 17066.6667 21300.0000 13016.6667 21600.0000 14150.0000 21600.0000 14966.6667 21600.0000 16500.0000 22183.3

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Size of the array a[] const int mxN = 1005; // Structure to store the x and // y coordinates of a po

Intercity Travelling(数学公式推导 cf div2 E)

题目传送门:E. Intercity Travelling   题意:数轴上从0出发到n,值为1 - (n-1)的点中均可以休息,也可以不休息。现在给定一个数组a[ ],a[i]表示走长度为i的距离的困难度(保证a[i+1]>a[i]),设每种情况出现的可能性均相同,求所有可能性的期望困难度之和p*2^(n-1)。   思路:有题意可知,总共有2^(n-1)种情况。分别统计所有情况中

Codefroces - 1009E - Intercity Travelling (概率期望)

Problem - 1009E - Intercity Travelling 题意: 从0走到n,休息后走的第 i km 的难度为 ai ,刚开始从 a1 开始每次经过休息点重新置一 休息点的个数和分布是随机的,并且概率相同 求从 0 到 n 的难度的期望   题解: 每个点是休息点和不是休息点的概率都为0.5 第 i km的难度概率分布为, P(Xi = a1) = 0.5 (

codeforces 1009 E - Intercity Travelling

题意: 你需要从坐标0开车到坐标n,其中坐标1....n-1可以设置休息站。 当你连续开k站时,每两站间的疲劳值为a1,a2……ak,如果第k站有休息点,那么你可以在此处休息,然后接下来的站点的疲劳值又从a1开始,否则继续为ak+1 求所有休息站情况的疲劳值总和 思路: 也就是求和 sum(a[i] * 消耗a[i]出现的总次数) (i->1,2,3,…n); 我们可以按照这种思路,统

1009E Intercity Travelling 【数学期望】

题目:戳这里 题意:从0走到n,难度分别为a1~an,可以在任何地方休息,每次休息难度将重置为a1开始。求总难度的数学期望。 解题思路: 跟这题很像,利用期望的可加性,我们分析每个位置的状态,不管怎么休息位置1的难度永远是a1,因此其期望为a1*2^(n-1),其他点出现a1的话,说明上一个点绝对休息过,剩下的都与其无关,也就是2^(n-2),所有的统计起来,则a1的出现次数为2^(n-1)+(

数学题(期望+概率+快速幂)CodeForces 1009E-Intercity Travelling

数学题(期望+概率)CodeForces 1009E-Intercity Travelling 题目链接:E. Intercity Travelling 思路: 路程为n,给定困难度(a1~an),过程中(1~n-1)都可能有休息站,概率为1/2,如果第k点有休息站,那么下一站困难度从a1开始,否则困难度加一,求到终点困难度的期望值*2^(n-1) 推算规律 竖着看,对路