博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hie with the Pie
阅读量:4979 次
发布时间:2019-06-12

本文共 1369 字,大约阅读时间需要 4 分钟。

Hie with the Pie poj-3311

    题目大意:n+1个点,伪旅行商问题。

    注释:n<=10。

      想法:咳咳,第一道状压dp,下面我来介绍一下状压dp。

        所谓dp,就是动态性决策规划,通过上一时刻或上几时刻的状态来更新当前状态并且无后效性。而状压dp就是将之前的状态通过二进制表现出来。几个例子。有五个格子_ _ _ _ _。上面可以放棋子或者不放。我们将放棋子的格子标注为1,不放棋子的格子标注为0。那么,我们就可以用一个二进制数来表达出人任何一个的完整状态而不是片面的,这就是状压dp。但是由于我们需要表示出所有的状态,所以状压dp的空间复杂度是指数级的,这就比较的伤心。所以看见题目的数据范围有那么一个小的可怜的,可以考虑考虑状压dp。状压dp前置知识点是位运算,在此不做介绍。

      关于这道题,我们设dp[s][i]。表示s这个状态的最小代价,且这个状态最后到达的点是i。之后转移就是枚举s的上一个到达的点。在此,我们要注意,题目中给出的是邻接矩阵的形式,我们先用floyd求出两点之间的最短路,之后通过上一个到达的点的状态加上dis[j][i]来更新当前状态。

    最后,附上丑陋的代码... ...

#include 
#include
#include
#define inf 0x3f3f3f3fusing namespace std;int dp[5000][20];int map[20][20];int main(){ int n; while(1) { memset(map,0x3f,sizeof(map)); memset(dp,0,sizeof(dp)); scanf("%d",&n); if(!n) return 0; for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { scanf("%d",&map[i][j]); } } for(int k=0;k<=n;k++)//floyd { for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } for(int S=0;S<=(1<

 

  小结:题目中明确指出所给的邻接矩阵可能不是对称的,容易在floyd时将其按照对称处理。

转载于:https://www.cnblogs.com/ShuraK/p/8468050.html

你可能感兴趣的文章
**p
查看>>
优先队列详解
查看>>
VS2012 创建项目失败,,提示为找到约束。。。。
查看>>
设计类图
查看>>
类对象
查看>>
[Voice communications] 声音的滤波
查看>>
软件建模——第9章 毕业论文管理系统—面向对象方法
查看>>
[SDOI2008]洞穴勘测
查看>>
Difference between Linearizability and Serializability
查看>>
IDEA使用操作文档
查看>>
UIView
查看>>
添加日期选择控件
查看>>
bzoj4765: 普通计算姬 (分块 && BIT)
查看>>
看完漫画秒懂区块链
查看>>
Oracle命令类别
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
css选择器
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>