POJ2686

比较简单的 状态压缩DP

注意DP方程转移时,新的状态必然数值上小于当前状态,故最外层循环为状态从大到小即可。

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1 << 10;
const int maxm = 31;
const int INF = 1 << 29; int n, m, p, a, b;
int t[maxm];
int d[maxm][maxm]; //图的邻接矩阵表示(-1表示没有边) //dp[S][v] := 到达剩下的车票集合为S并且现在在城市v的状态所需要的最小花费
double dp[maxn][maxm]; void solve()
{
for (int i = 0; i < (1 << n); i++)
fill(dp[i], dp[i] + m + 1, INF); //用足够大的值初始化 dp[(1 << n) - 1][a] = 0;
double res = INF;
for (int i = (1 << n) - 1; i >= 0; i--){
for (int u = 1; u <= m; u++){
for (int j = 0; j < n; j++){
if (i & (1 << j)){
for (int v = 1; v <= m; v++){
if (d[v][u]){
//使用车票i,从v移动到u
dp[i & ~(1 << j)][v] = min(dp[i & ~(1 << j)][v], dp[i][u] + (double)d[u][v] / t[j]);
}
}
}
}
}
}
for (int i = 0; i < (1 << n); i++)
res = min(res, dp[i][b]);
if (res == INF)
//无法到达
printf("Impossible\n");
else
printf("%.3f\n", res); } int main()
{
while(scanf("%d%d%d%d%d", &n, &m, &p, &a, &b)!= EOF){
if(!n && !m)
break;
memset(d, 0, sizeof(d));
for (int i = 0; i < n; i++)
scanf("%d", &t[i]);
for (int i = 0; i < p; i++){
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
d[u][v] = d[v][u] = c;
}
solve();
}
return 0;
}

  

POJ2686 Traveling by Stagecoach 状态压缩DP的更多相关文章

  1. poj 2686 Traveling by Stagecoach ---状态压缩DP

    题意:给出一个简单带权无向图和起止点,以及若干张马车车票,每张车票可以雇到相应数量的马. 点 u, v 间有边时,从 u 到 v 或从 v 到 u 必须用且仅用一张车票,花费的时间为 w(u, v) ...

  2. Traveling by Stagecoach 状态压缩裸题

    Traveling by Stagecoach dp[s][v]  从源点到达  v,状态为s,v的最小值.  for循环枚举就行了. #include <iostream> #inclu ...

  3. POJ2686 Traveling by Stagecoach(状压DP)

    题意: 有一个旅行家计划乘马车旅行.他所在的国家里共有m个城市,在城市之间有若干道路相连.从某个城市沿着某条道路到相邻的城市需要乘坐马车.而乘坐马车需要使用车票,每用一张车票只可以通过一条道路.每张车 ...

  4. POJ 2686_Traveling by Stagecoach【状态压缩DP】

    题意: 一共有m个城市,城市之间有双向路连接,一个人有n张马车票,一张马车票只能走一条路,走一条路的时间为这条路的长度除以使用的马车票上规定的马车数,问这个人从a出发到b最少使用时间. 分析: 状态压 ...

  5. 旅行商问题——状态压缩DP

    问题简介 有n个城市,每个城市间均有道路,一个推销员要从某个城市出发,到其余的n-1个城市一次且仅且一次,然后回到再回到出发点.问销售员应如何经过这些城市是他所走的路线最短? 用图论的语言描述就是:给 ...

  6. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  7. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  8. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  9. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

随机推荐

  1. 对django中间件的理解

    1. 什么是中间件(Django)? 对Django而言,中间件就是继承自MiddlewareMixin(位于django.utils.deprecation模块下)的类,该类对请求(request) ...

  2. 【Codeforces 1042D】Petya and Array

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...

  3. 【Objective-C】07-自定义构造方法和description方法

    在第5讲中已经介绍了如何定义类和创建并初始化对象,比如有Student这个类 1.Student.h 1 #import <Foundation/Foundation.h> 2 3 @in ...

  4. STM32F407 按键输入实验 库函数版 个人笔记

    读取IO口输入的函数: STM32F4 的 IO口做输入使用的时候,是通过调用函数 GPIO_ReadInputDataBit()来读取 IO 口的状态的.了解了这点,就可以开始我们的代码编写了. 按 ...

  5. NYOJ-769乘数密码,逆元解法;

    乘数密码 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 ->    Link    <- 简单代替密码的第二种,比移位密码稍微复杂点,不过鉴于NYOJ,是完全可以 ...

  6. String replaceAll-正则匹配-截取以指定字符开头,以指定字符结尾的字符串

    scala代码块 截取以某个字符开头,以某个字符结尾的字符串 def main(args: Array[String]): Unit = { val s = "{{a61,a2,a3},{b ...

  7. [luoguP2709] 小B的询问(莫队)

    传送门 个数 1 2 3 4 5 答案 1 4 9  16 25 做差 1 3 5 7 9 显然增加一个数只需要增加 ton[a[x]] << 1 | 1 即可 减去一个数也减去这个 注意 ...

  8. 【Eclipse】eclipse安装JAVA反编译插件

    前言:在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作,对于一些框架的代码我们总怀有一些好奇之心,想一探究竟,有源码当然更好了,对于有些JAR包中的代码我们就需要利用反编译工具来看一下了,下面 ...

  9. 【IntelliJ】IDEA使用--字体、编码和基本设置

    IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...

  10. 单调队列&单调栈 基础

    参考博客https://www.cnblogs.com/tham/p/8038828.html 例题  poj 2823 Sliding Window Time Limit: 12000MS   Me ...