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 ...
随机推荐
- 微信小程序开发工具中快捷键
微信小程序开发工具表面上是没有更多的样式类的工具,例如缩进.隐藏代码什么的. 现在总结一下小程序开发工具常用的一些快捷键: 格式调整 Ctrl+S:保存文件Ctrl+[, Ctrl+]:代码行缩进Ct ...
- js杨辉三角控制台输出
function Yang(line){ var arr=new Array() ;i<=line;i++){ ]==undefined){arr[i-]=[];} ){arr[]=[i]}){ ...
- 东软实习<3>
今天学习过程和小节 主要对多线程,单例模式以及jdbc进行了一些深入着重的学习, 还有就是学习了如何使用java操作HDFS 主要是对于一些继承调用的使用等 1.封装JDBC,自定义范型 2.反射,自 ...
- APP研发录笔记
一.消灭全局变量 在内存不足时,系统会回收一部分闲置的资源,由于App被切换到后台,所以之前存放的全局变量很容易被回收,这时再切换到前台继续使用,会报空指针崩溃.想彻底解决这个问题,就要使用序列化. ...
- React-Native的基本控件属性方法,对React-Native的学习,从熟悉基本控件开始。
对React-Native的学习,从熟悉基本控件开始. View 属性方法 序号 名称 属性Or方法 类型 说明 1 accessibilityLabel 属性 string 2 accessib ...
- Go语言反射reflect
目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...
- [Swift]LeetCode969.煎饼排序 | Pancake Sorting
Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...
- 代码覆盖率 (Code Coverage)从简到繁 (一)
代码覆盖率(Code Coverage)是反映测试用例对被测软件覆盖程度的重要指标,也是衡量测试工作进展情况的重要指标.它也是对测试工作进行量化的重要指标之一,测试工作往往不如开发那样激动人心,一个重 ...
- iOS学习——Quartz2D学习之DrawRect
Quartz2D学习之DrawRect 本文以问答形式主要讲述Quartz2D的相关内容,参考内容是网上下载的学习视频资料. 1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Ma ...
- Git的使用--如何将本地项目上传到Github(三种简单、方便的方法)
一.第一种方法: 1.首先你需要一个github账号,所以还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路(傻瓜式安装) ...