HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,,
hdu 3001 经典的状压dp
大概题意。。有n个城市 m个道路 成了一个有向图。n<=10; 然后这个人想去旅行。有个超人开始可以把他扔到任意的一个城市。。然后他就在城市之间游荡。要满足他要游玩所有的城市。。并且。每个城市最多去两次。要求路程最短。。如果他不能游完所有的城市,,那么。。就输出-1 否则 输出最短距离
如果用搜索。。。不靠谱 然后用搜索,,
怎么压缩?? 用一个整型数 i 表示他现在的状态。。显然一个城市是要用两位。。00 表示没去过 01 表示去了一次 10 表示去了两次 然后最多10个城市,。。那么一共用20位 2^20一共是。。1024*1024 也就是10^6大概吧。。 然后dp[i][j] 表示的是 当前这个状态。。并且 最后他在j城市的最短路径。。然后他可以去另外的城市 咋一看 这个时间复杂度是 。。10^6 * 10 * 10 然后加上各种判断。。还要开一个10^6 *10 的数组 然后就MLE 了,,我们发现 i 在自然数里面并不是连续的 而是离散的 我们 先找出满足条件的 i 存在一个数组inn里面 然后用二分查找 。。。相当于用了一个哈希表,,存了这么多的情况,,,然后就是dp转移了,,,,
MLE 1 wa1 : 没考虑输出-1 的情况
代码不长
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <string>
#include <queue>
#include <cstring>
#define CL(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define TEST cout<<"TEST ***"<<endl;
#define INF 0x7ffffff0
#define MOD 100000000
using namespace std; int inn[];
int dp[][];
int gra[][];
int n,m,cii; int bin(int s,int e,int v)
{
int mid=(s+e)/;
if(inn[mid]==v)return mid;
if(inn[mid]>v)return bin(s,mid,v);
else return bin(mid+,e,v);
} int initinn()
{
int i,ctt=,taginn,teminn;
for(i=;i<=;i++)
{
teminn=i;taginn=;
while(teminn)
{
if((teminn&)==)
{
taginn=;
break;
}
teminn=teminn>>;
}
if(taginn==)
{
inn[ctt++]=i;
}
}
return ctt;
} int main()
{
cii=initinn();
while(scanf("%d %d",&n,&m)!=EOF)
{
CL(gra,-);
int i,j,k,a,b,w;
int rem=INF;
int ma=(<<(*n))-;
for(i=;i<m;i++)
{
scanf("%d %d %d",&a,&b,&w);
if(gra[a][b]==-||gra[a][b]>w)
{
gra[a][b]=gra[b][a]=w;
}
} CL(dp,-);
for(i=;i<=n;i++)dp[][i]=;
for(i=;i<=n;i++)gra[][i]=gra[i][]=gra[i][i]=;
for(i=;inn[i]<=ma;i++)
{
a=inn[i];
for(j=;j<=n;j++)
{
if(dp[i][j]==-)continue;
for(k=;k<=n;k++)
{
if(gra[j][k]==-)continue;
b=k-;
if(a&(<<(*b+)))continue;
w=a+(<<(*b));
w=bin(,cii,w);
if(dp[w][k]==-||dp[w][k]>dp[i][j]+gra[j][k])
dp[w][k]=dp[i][j]+gra[j][k];
}
b=; w=a;
for(k=;k<=n;k++)
{
if((w&)==)
{
b=;
break;
}
w=w>>;
}
if(b==&&dp[i][j]<rem)rem=dp[i][j];
}
}
if(rem==INF)rem=-;
printf("%d\n",rem);
}
return ;
}
HDU 3001 状压DP的更多相关文章
- hdu 3001(状压dp, 3进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 由于本题中一个点最多能够访问2次,由此可以联想到3进制; visited[i][j]表示在状态i ...
- hdu 3001(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 思路:这道题类似于TSP问题,只不过题目中说明每个城市至少要走一次,至多走2次,因此要用到三进制 ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- hdu 2809(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- hdu 3254 (状压DP) Corn Fields
poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...
- HDU 5823 (状压dp)
Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...
- hdu 4739 状压DP
这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...
随机推荐
- [Mugeda HTML5技术教程之1] HTML5: 生存还是毁灭
[Mugeda HTML5技术教程] 开篇: HTML5 - 生存,还是毁灭 摘要:HTML5并不试图解决所有问题.但是在很多适合的场合,HTML5是不二选择. To be, or not to be ...
- linux清理僵尸进程
查看服务器时发现好3个僵尸进程,僵尸进程存在好多天了,一直不会处理,留到了今天,顺便清理下僵尸进程吧 top命令中统计了僵尸进程,是第二行最后一项3 zombie. 或者使用下面的命令得到僵尸进程数量 ...
- virtual pc中添加软盘支持
最近对操作系统挺有兴趣的,实验了一下!准备找一个虚拟机,之前在xp上使用virtual pc感觉不错,准备在本机上装一下,但是发现居然不支持软盘了! 查阅了各种资料,终于找到了解决的办法. 1. 下载 ...
- 文件操作IO流
fopen 打开文件或者生成文件 getc 向文件中读取一个字符 putc 向文件中写入一个字符 fgets 向文件中读取字符串 参数可以设置获取多少个字符串 fputs 向文件中写入字符串 不自动添 ...
- JavaWeb学习笔记--3.JavaBean
JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...
- QT creator中使用opencv
最近要用到opencv做图像方面的东西,网上很多是用VS加opencv,但自己对VS不怎么喜欢,想用QT Creator.在网上搜索了很多资料,终于花了一天的时间,在QT Creator上能使用ope ...
- SSH本地端口转发
也是在公司常用的命令,还没有将EXPECT和SPAWN结合好,先用着: 带证书验证远程登陆的. (从公司内网服务器直接跳到外网服务器的内网端口) ssh -C -f -N -g -i private_ ...
- 这样就算会了PHP么?-6
关于PHP与WEB表单交互的CASE,十多年前没拾起来啊. 下一步进入JS与PHP的交互... <form name="form1" method="post&qu ...
- LeetCode_Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- C51 Keil 优化
对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难 ...