终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态.DP[i][j]表示当前状态为i,j是道路的最后一个城市. 如果j城市可以到达k城市,那么下一个状态就是next = i + bit[k],转移方程DP[next][k] = min(DP[next][k], DP[i][j] + cost[j][k]),cost[j][k]表示城市j到k的花费.…
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<…
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问次数,然后 bfs 进行遍历,不过要注意这个题卡内存,必须要去年一些无用的状态,要不然会超内存的,还不能枚举每个城市, 这样可能会超时的,可以直接把所有的城市放进去,直接进行遍历.一个比较经典的题目. 代码如下: #pragma comment(linker, "/STACK:1024000000,…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次的最短距离. 思路:状压dp+三进制,dp[i][j]表示在状态i下以j为目标城市的最短距离,转移方程为nw = i + fi[k];dp[nw][k] = min(dp[nw][k], dp[i][j] + mp[j][k]). 代码实现如下: #include <set> #include &…
(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) brea…
        ID Origin Title   17 / 60 Problem A ZOJ 3537 Cake   54 / 105 Problem B LightOJ 1422 Halloween Costumes   59 / 90 Problem C POJ 2955 Brackets   26 / 51 Problem D CodeForces 149D Coloring Brackets   47 / 58 Problem E POJ 1651 Multiplication Puz…
        ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawrence   1 / 5 Problem C HDU 4528 小明系列故事――捉迷藏   5 / 6 Problem D HDU 1300 Pearls   0 / 42 Problem E HDU 2993 MAX Average Problem   1 / 20 Problem F UVALi…
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就是说只有炮弹和人在某个整数时间待在同一个位置人才会被打死.问人能否到达(n,m). 思路:直接bfs即可,shot[t][x][y]表示在t时刻,是否有炮弹在(x,y)这个位置,可以预处理该数组. 注意: 1. 人不能穿越碉堡. 2. 炮弹每隔t秒发射一次,炮弹不能穿越其他碉堡. 3. 样例1中人必…
题意:有两只鬼,一个男孩女孩被困在迷宫中,男孩每秒可以走三步,女孩只能1步,鬼可以两步且可以通过墙.问男孩女孩是否可以在鬼抓住他们之前会合? 注意:每秒开始鬼先移动,然后两人开始移动. 思路:以男孩和女孩为起点进行双向bfs,鬼由于可以穿墙可以直接通过曼哈顿距离判断当前位置是否合法.注意在处理男孩移动的时,必须加入一点技巧,否则处理状态太多就会超时.我用的一种比较笨的方法处理男孩的移动结果TLE了. AC代码: 405ms #include<cstdio> #include<cstrin…
题意:    起初定28张卡牌的排列,把其中11,  21, 31, 41移动到第一列,然后就出现四个空白,每个空白可以用它的前面一个数的下一个数填充,例如43后面的空格可以用44填充,但是47后面即使有空白也无法填充,因为没有48. 思路:每次有四个空格,面临四个选择,直接用bfs搜索,状态保存的话就自己设计一个哈希函数,如果找不到完美哈希一定要解决冲突. 我设计的哈希函数:我用的是双哈希,第一个哈希值用于查找,第二个哈希值可以看做整个卡牌状态的压缩,如果有两种状态有同一个第一哈希,我就用第二…