(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…
题目链接: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 &…
终于刷完搜索专题了. 题意:给定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的花费.…
Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5896    Accepted Submission(s): 1908 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is…
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8286    Accepted Submission(s): 2703 Problem Description After coding so many…
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2次. 分析:和TSP问题差不多,只不过变成三进制的状压,dig[i][j]表示在状态i下在点j已经做过的次数,dp[i][j]表示在状态i下到达点j走过的最小的路程,于是我们可以通过预处理得到dig[i][j]数组,然后就是一般的状态转移. #include <cstdio> #include &…
哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.net/lenleaves/article/details/7980955  这个博客 每一个城市能够经过1或2次.所以三进制能够代表全部状态了.接下来处理方式类似于二进制的,仅仅是没有了位运算一些推断跟预处理有点繁琐 方程dp[s][i] = min(dp[s][i] ,  dp[s - (s除去j剩…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4026 Unlock the Cell Phone Time Limit: 6000/3000 MS (Java/Others)Memory Limit: 65768/65768 K (Java/Others) 问题描述 Modern high-tech cell phones use unlock patterns to unlock the system. The pattern is usua…
这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写混. (4)在dp过程中0这个点是不用的,只用到1到n这个点 而实际上dp过程中用的是0到n-1,所以就枚举1到n,然后涉及到集合的地方就写i-1 其他地方如dp的第二维,距离这些都不变. 还有一个方法,是我一开始想的方法,就是在输入的时候就把0放到第n个点,其他下标-1 (4)这道题求最小值,一定…
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 << 11][1 << 11]显然是要MLE的,我们可以想到用滚动数组优化,事实上确实可以用滚动数组优化.然而 在时间复杂度上 100 * 1024 * 1024 * 1024也是一个不可能补TLE的数字,一个不那么显然的办法是预处理出所有可行的状态,经过看题解或者写个暴力炸一下之后可以知道…