Hdu 3001 Travelling 状态DP
题目大意
一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用
每个城市最多访问两次,用状态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的更多相关文章
- hdu 3001 Travelling(状态压缩 三进制)
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
- hdu 4614 pieces 状态DP
题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数. 状态+dp dp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串): 连接:htt ...
- Hdu 4539 【状态DP】.cpp
题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- HDU - 3001 Travelling(三进制状压dp)
Travelling After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best ch ...
- HDU 3001 Travelling 3进制状压dp
题意:10个点,若干条边,边有花费,每个点最多走两次,求走过所有点,花费最少 分析:因为每个点最多走两次,所以联想到3进制,然后枚举状态,就行了(我也是照着网上大神的代码写的) #include &l ...
随机推荐
- vue-router下的html5 history在iis服务器上的设置 vue去掉#
转自:https://www.cnblogs.com/zzsdream/p/6576639.html 1.安装 url rewrite模块到IIS 下载地址 2.在web.config文件中 syst ...
- swust oj 1052
输出利用先序遍历创建的二叉树中的指定结点的双亲结点 1000(ms) 10000(kb) 2415 / 5575 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点.约定二叉树结点数据为 ...
- COOKIE和Session的原理及异同
COOKIE和Session的原理及异同 1. cookie的创建和读取 cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的w ...
- Ansible批量修改root密码
0x01:首先做好免密登录 http://www.cnblogs.com/evlon/p/8094306.html 0x02:批量修改密码 ansible all -m raw -a "ec ...
- Go接口interface
目录 接口是什么? interface类型 空接口(interface{}) interface函数参数 interface变量存储的类型 类型断言 嵌入interface 接口是什么? Go 语言不 ...
- C++ Opencv remap()重映射函数详解及使用示例
一.重映射及remap()函数介绍 重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程.即: 在重映射过程中,图像的大小也可以同时发生改变.此时像素与像素之间的关系就不是一一对应关系,因 ...
- [Swift]LeetCode466. 统计重复个数 | Count The Repetitions
Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...
- 微信小程序请求API接口PHPSESSID变化的解决方式
微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...
- Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制
目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...
- 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建
目录 0.引言 1.什么是Visual Studio项目模板 2.IWizad接口 3.通过Visual Studio扩展开发实现领域驱动开发 3.1 使用VSIX+ProjectTemplate创建 ...