题目大意

一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用

每个城市最多访问两次,用状态0,1,2标识访问次数

把城市1~N的状态按照次序连接在一起,就组成了一个三进制数,所有N个城市的状态都能对应到一个三进制数,对一个状态而言,已经访问的城市不关心它的访问的顺序是怎样的,只要知道到达了这个状态,最后访问是哪一个城市就可以进行转移了,

于是定义状态dp[i][j]标识N个城市处于i的状态,最后一个城市是j所需要的最小费用,

状态转移方程可以是

dp[i+3^i][v]=min(dp[i+3^i][v],dp[i][j]+cji)

每个状态初始化为无穷,标识这个状态未被访问到,根据题意,可以选择任意一个城市为出发点,初始化dp[3^j][j]==0标识从任意一个城市出发所需的代价为0,

外层循环i 从 1 to3^N 保证,每个状态计算到

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[60000][11];
#define gets(i,j) (i/len[j])%3
int c[20][20];
int len[11];
int main(){
len[0]=1;
for(int i=1;i<=10;i++){ //计算3^i保存在len[i]中
len[i]=len[i-1]*3;
}
int n,m,f,u,v,a,b,w,ans;
while(scanf("%d%d",&n,&m)!=EOF){
memset(c,0x3f,sizeof(c));//初始化任意城市间的道路距离为无穷
memset(dp,0x3f,sizeof(dp));//初始化所有状态为无穷,表示该状态还未到达
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&w);
a--;b--; //城市编号从0---n-1
c[a][b]=c[b][a]=min(c[a][b],w); //a,b间区所有道路的是最小值
}
ans=dp[0][0];
for(int i=0;i<n;i++){
dp[len[i]][i]=0;
}
for(int i=1;i<len[n];i++){
f=1;
for(int j=0;j<n;j++){
if(gets(i,j)==0){ //表示城市j在状态i下未被访问
f=0;continue;
}
for(int v=0;v<n;v++){
//城市在状态i下被访问过两次,不能再访问
if(gets(i,v)==2){
continue;
}
u=i+len[v];
dp[u][v]=min(dp[u][v],dp[i][j]+c[j][v]);
}
}
if(f){
//第i个城市满足旅行的条件,取该情况下最小费用
for(int j=0;j<n;j++){
ans=min(ans,dp[i][j]);
}
}
}
if(dp[0][0]==ans){
ans=-1;
}
printf("%d\n",ans);
}
return 0; }

  

Hdu 3001 Travelling 状态DP的更多相关文章

  1. hdu 3001 Travelling(状态压缩 三进制)

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二

    终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...

  3. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  4. hdu 4614 pieces 状态DP

    题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数. 状态+dp dp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串): 连接:htt ...

  5. Hdu 4539 【状态DP】.cpp

    题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...

  6. HDU 3001 Travelling(状态压缩DP+三进制)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...

  7. HDU 3001 Travelling (三进制状态压缩 DP)

    题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...

  8. HDU - 3001 Travelling(三进制状压dp)

    Travelling After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best ch ...

  9. HDU 3001 Travelling 3进制状压dp

    题意:10个点,若干条边,边有花费,每个点最多走两次,求走过所有点,花费最少 分析:因为每个点最多走两次,所以联想到3进制,然后枚举状态,就行了(我也是照着网上大神的代码写的) #include &l ...

随机推荐

  1. Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  2. 使用Bandwagon服务器ftp解决git clone速度慢的问题

    写在前面 git clone速度往往很慢,我们可以先在身处美国的服务器上git clone,然后把文件用ftp传回来即可. 开始 我们以opencv为例 git clone https://githu ...

  3. CPU运行原理

    问题: CPU位宽表示什么意思? 下面这个是 https://www.bilibili.com/video/av9667986?from=search&seid=336127932106862 ...

  4. DDD事件总线的实现

    基本思路: (1)       在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2)       利用反射,事件总线会将实现了IEventHandler的处理程序与相应事件关联到一起,相当 ...

  5. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  6. 模仿bootstrap做的 js tooltip (添加鼠标跟随功能)

    主要思路: 使用jquery hover方法,当进入时显示tooltip,移出时隐藏tooltip当设定为鼠标跟随时,使用mousemove事件显示tooltip根据tooltip显示位置设置,计算t ...

  7. [Swift]LeetCode930. 和相同的二元子数组 | Binary Subarrays With Sum

    In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...

  8. Python - Python2与Python3的区别、转换与兼容

    区别 Python2.x与Python3.x版本区别:http://www.runoob.com/python/python-2x-3x.html 示例解读Python2和Python3之间的主要差异 ...

  9. 【web.xml】项目从web.xml开始

    前言 依自己目前的所闻所见,每个项目的WEB-INF下都会带有一个web.xml配置文件.当启动项目时,web容器(tomcat)会首先去读取web.xml中的内容,读取加载完成后才算完成了项目的启动 ...

  10. wget Mac OS 下安装

    wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...