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 ...
随机推荐
- java学习之路--零碎的知识笔记
java运算符: 自增自减运算符: int b = ++a; 拆分运算过程为: a=a+1=4; b=a=4, 最后结果为b=4,a=4 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再 ...
- node.js搭建Web服务器
Node.js 博客搭建 一. 学习需求 Node 的安装运行 会安装node,搭建node环境 会运行node. 基础模块的使用 Buffer:二进制数据处理模块 Event:事件模块 fs:文件系 ...
- python从入门到实践-4章操作列表
magicians = ['alice','david','carolina']for magician in magicians: print(magician) print(magician.ti ...
- CSS文字的跑马灯特效
上学时同学有个来电带跑马灯的手机,可把我羡慕坏了,可等我买的起手机时,跑马灯不流行了,甚伤萝卜心! 今天就用CSS做个文字的跑马灯特效,缅怀一下本萝卜逝去的青春! 道具:会敲代码的巧手.七窍玲珑心.会 ...
- [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- [Swift]LeetCode293. 翻转游戏 $ Flip Game
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...
- 【dotNet Core】Swagger下简单的给WebApi分组
Startup.cs下ConfigureServices代码 这里主要在DocInclusionPredicate控制输出那些api. Startup.cs下Configure代码 给Controll ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- Python文本数据互相转换(pandas and win32com)
(工作之后,就让自己的身心都去休息吧) 今天介绍一下文本数据的提取和转换,这里主要实例的转换为excel文件(.xlsx)转换world文件(.doc/docx),同时需要使用win32api,同py ...
- dataframe去除null、NaN和空字符串
去除null.NaN 去除 dataframe 中的 null . NaN 有方法 drop ,用 dataframe.na 找出带有 null. NaN 的行,用 drop 删除行: import ...