(1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制

如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么

void init()
{three[0] = 1;REP(i, 1, 11)three[i] = three[i-1] * 3;REP(i, 0, three[10]){int t = i;REP(j, 0, 10){digit[i][j] = t % 3;t /= 3;if(t == 0) break;}}
}

同时这里不能用位运算,因为不是二进制。如果涉及到某一位加1,就加上就好了,不能用|

然后统计答案的时候比较麻烦,要枚举每一位是不是0

(2)凡是涉及到进制的,下标都从0开始。输入的时候记得要下标减减

(3)Tsp问题的基本套路是这样的(我用的是填表法)

dp数组全部初始化为最大值

起点初始化为0,即dp[1 << i][i] = 0

第一层循环枚举所有可能的状态S

第二层枚举当前点i,这里要求这个点已经经过

第二层枚举之前的点j,这里同样要求这个点已经经过

dp[state][i] = min(dp[state][i], dp[state^(1 << i)][j] + dist[j][i])

记住要去掉当前这个点

最后答案就是min(dp[(1 << n) - 1][i])

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;const int MAXN = 15;
int dist[MAXN][MAXN], dp[60000][MAXN], n, m;
int three[MAXN], digit[60000][MAXN];void init()
{three[0] = 1;REP(i, 1, 11)three[i] = three[i-1] * 3;REP(i, 0, three[10]){int t = i;REP(j, 0, 10){digit[i][j] = t % 3;t /= 3;if(t == 0) break;}}
}int main()
{init();while(~scanf("%d%d", &n, &m)){memset(dist, 0x3f, sizeof(dist));while(m--){int u, v, w;scanf("%d%d%d", &u, &v, &w); u--; v--; //注意要-- dist[u][v] = dist[v][u] = min(dist[u][v], w);}int ans = 1e9;memset(dp, 0x3f, sizeof(dp)); //初始化不能忘 REP(i, 0, n) dp[three[i]][i] = 0;REP(S, 0, three[n]){bool ok = true;REP(i, 0, n){if(digit[S][i] == 0) { ok = false; continue; } //i要已经经过。 REP(j, 0, n) if(digit[S][j] >= 1) //j已经经过 dp[S][i] = min(dp[S][i], dp[S-three[i]][j] + dist[j][i]);}    if(ok) REP(i, 0, n) ans = min(ans, dp[S][i]);}printf("%d\n", ans == 1e9 ? -1 : ans);}return 0;
}

转载于:https://www.cnblogs.com/sugewud/p/9819327.html

HDU3001 Traveling (状压dp+三进制+Tsp问题总结)相关推荐

  1. HDU-3001(旅行商问题+三进制状压dp)

    #include <bits/stdc++.h> using namespace std; /* 题目大意: 给定n个点m条边的带权无向图,问有没有可能从n个点的其中一个出发,走遍其余n ...

  2. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  3. 涂抹果酱(三进制状压dp)

    涂抹果酱(状压dp) 题目描述 输入描述: 输出描述: 示例 输入 输出 说明 备注: 题目思路: 代码 欢迎关注微信公众号:Java后台开发 题目描述 Tyvj两周年庆典要到了,Sam想为Tyvj做 ...

  4. 【状压DP】poj2686 Traveling by Stagecoach

    状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可. #include<cstdio> #include< ...

  5. 动态规划 —— 状压 DP

    [概述] 通常将以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为状态压缩动态规划. 其是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划与基于连通性状态压缩的动态规划两 ...

  6. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  7. 蒜头君救人 状压DP

    蒜头君救人 题目描述 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境,假设蒜头君所在的村子是 n×m n×m 的网格,网格中.号代表平 ...

  8. 【BZOJ1087】【codevs2451】互不侵犯,状压DP

    传送门1 传送门2 写在前面:第一次写状压DP,感觉还好,至少比数论好些,还有就是让我膜一发位运算-- 思路:一看数据范围n<=9而且是省选,就知道这个题九成是状态压缩,题目限制条件与上一行的摆 ...

  9. HITOJ 2662 Pieces Assignment(状压DP)

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

最新文章

  1. RPC简介,及与web service的对比
  2. 前段框架——VueX
  3. 如何卸载Windows 7中的IE10并还原到IE9
  4. 嵌入式Linux操作系统的版本查询
  5. 谷歌聊天机器人api_如何编写针对Google地图等网络应用量身定制的聊天机器人
  6. 01-02 Linux常用命令-文件处理
  7. MyBatis嵌套Collection
  8. Python基础篇:Python 程序流程控制,让你的代码有理有据
  9. python 绘制中国地图并利用经纬度标注散点
  10. IDEA乱码解决合集
  11. html页面默认字体有哪些,html网页默认字体 - niuhongxia的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. 设计原则SOLD之 —— 单一职责原则SRP
  13. ACS高级计算机科学,2018-2019澳洲八大ACS认证学位全盘点!③
  14. OneZero第一次站立会议Sprint Planning Meeting(2016.3.21)
  15. 容器编排的作用和要实现的内容
  16. Java集合详解6:TreeMap和红黑树
  17. EasyExcel基础使用教程
  18. 天猫淘宝登陆页面无限循环 解决办法
  19. 【吴恩达团队】TensorFlow2.0中的自然语言处理
  20. 个人站——联系我页面设计

热门文章

  1. 6、Fatfs系统移植
  2. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:11 如何提高你的NLP技能
  3. 怎样申请软件著作权呢
  4. python操作excel及爬取美赛证书
  5. DAMO-YOLO : A Report on Real-Time Object Detection Design
  6. web前端入门到实战:css基础-定位+网页布局案例
  7. pup2usb: 小芭比Puppy Linux硬盘/U盘安装程序
  8. 抖音自媒体如何做出爆款视频?学会追热点,快速打破流量池
  9. 9000字通俗易懂的讲解下Java注解,你还看不明白?,linux操作系统基础与应用答案
  10. Wdcp安装不存在phps的问题