hdu 4284 Travel(壮压DP&TSP&floyd)】的更多相关文章

Travel Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2621    Accepted Submission(s): 720 Problem Description PP loves travel. Her dream is to travel around country A which consists of N citi…
HDU 4284    Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1走完所有的他必须要去的城市,打完所有的工,并且成功回到起点1 由于H<=15,所以显然可以状压,预处理这些都必须去的城市之间的最短距离(可以floyd),然后状压DP[S][i]表示他到达了S这些城市后正处在第i个城市里(所以S & (1<<i) != 0)的剩余的最大的钱的数量,然…
看到第一眼就发觉是壮压DP 然后就三进制枚举子集吧. 这题真是壮压入门好题... 对于dp[i][j] 表示第i行,j状态下前i行的分配方案数. 那么dp[i][j]肯定是从i-1行转过来的 那么由于不能挨着放,那么我们肯定是枚举i - 1行状态时不能包含j的任何一位. 那么只要令k = ((1 << n) - 1) ^ j,k中肯定就不包含j的位了 是这样枚举k的子集 int sub = k; do { sub = k& (sub - 1); }while(sub != k); 然后…
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费的最短时间是多少 然后就是壮压DP了 dp[S][v] 代表当前消耗了S集合的车票走到v花费的最小时间 可以用spfa转移. 也可以直接转移. 直接转的原因是,这个图由于走路要消耗车票,所以实质上图是个DAG 看两种代码 #include <iostream> #include <cstdi…
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roads connecting them. PP has measured the money each road costs. But she still has one more problem: she doesn't have enough money. So she must work dur…
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用floyd预处理出每两个城市间的最短路,然后采用状压dp来解题.dp[i][j]表示在i这种状压下以j为目标城市的最短距离,i的二进制中x位为1表示到了城市x,为0表示没到城市x,则转移方程为dp[i][j] = min(dp[i][j], dp[i^(1<<(j-1))][k] + dis[k][j]…
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:12225   Accepted: 6441 Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortuna…
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示什么都不取得概率,p(x1)表示的是取x1的概率,最后要加一因为有又多拿了一次.整理一下就可以了. #include <cstdio> ; <<Maxn],p[Maxn]; int n; int main() { while (scanf("%d",&n)!…
[题目分析] 赤裸裸的状压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<…
虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸的TSP了,dp[sta][i]表示已经遍历过了sta集合中的点,现在在i点所需的最少花费.dp[i][j]=-1表示该点不可到达..但是在最后统计最小解的时候要特判... #include<algorithm> #include<iostream> #include<cstri…
The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1056    Accepted Submission(s): 655 Problem Description Given you n sets.All positive integers in sets are not less than 1 and…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u]表示在该状态state1(已经访问过的景点).state2(手中有的景点的票).目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1<<k)-1][state][1]了(0<=state<(1<<n)). #include<iostream> #incl…
据说是TSP经典问题...可以用状态压缩做.但是看到数据量,就厚着脸皮上搜索了...先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个...当时就暴搜了...但是注意城市1如果也需要工作的话不一定是第一个工作的城市... #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<cstdio> #i…
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N<=50,M<=50,因此很容易想到状压: 2.考虑X^3,其中X就是每种状况下亮着的灯的数量: 3.如何解这个X^3?我们把它展开——X=x1+x2+x3+...+xn,其中xi是第i个灯的亮或暗状况:因此X^3=(x1+x2+x3+...+xn)*(x1+x2+x3+...+xn)*(x1+x2+x…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Problem Description One day , Partychen gets several beads , he wants to make these beads a necklace . But not ever…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 问题描述 In combinatorics a permutation of a set S with N elements is a listing of the elements of S in some…
上来直接一波敲键盘,直接套Tsp问题的代码 然后WA 发现貌似这道题没有连续性. Tsp问题是一条路径,一个点到另一个点,多了一个限制,所以就需要加多一维 而这道题没有限制,也就是说那一维不需要加,我加了还WA 然后要搞清楚状态,在纸上可以写,写清楚了再敲代码 这道题一开始都是存在,初始状态是0000--所以就用0表示存在,1表示不存在 #include<cstdio> #include<cstring> #include<algorithm> #define REP(…
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的点.   n<=5 , m<=5. 解题分析 考虑从1~n*m,从小到大依次填数,则如果某个位置编号为X且该位置还未填数,那么其周围的点均不能填数. 令dp[i][j]表示填到第i个数,状态为j . 令X的个数为cnt,那么 j ∈[ 0 , 1<<cnt). 一种情况为第i个数填在…
题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <…
Problem Description In the ACM International Collegiate Programming Contest, each team consist of three students. And the teams are given 5 hours to solve between 8 and 12 programming problems.  On Mars, there is programming contest, too. Each team c…
题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1504    Accepted Submission(s): 865 Problem Description You're given an unlimited number of pebbles to distribute across an N x N gam…
终于刷完搜索专题了. 题意:给定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的花费.…
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问次数,然后 bfs 进行遍历,不过要注意这个题卡内存,必须要去年一些无用的状态,要不然会超内存的,还不能枚举每个城市, 这样可能会超时的,可以直接把所有的城市放进去,直接进行遍历.一个比较经典的题目. 代码如下: #pragma comment(linker, "/STACK:1024000000,…
题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不能访问所以的点,并且获得所以证书. 题解:目标是那些一定要访问的点,怎么到达的我们不关心,但是我们关心花费最少的路径,而且到达那个点后是一定要打工的,如果只是经过,那么在求花费最少的路径的时候已经考虑过了. 因此先用Folyd求出各个点直接的最短路径,由于N很小,又只要求出一个解,所以直接dfs暴搜…
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设一维表示前一个点(炮兵那题把点换成行) 这道题有很多细节需要注意 (1)计算路径长度.这道题一开始怎么不重复又方便的计算长度难住了我. 后来看到题解直接在初始化的时候算上路径,非常牛逼 然后前两个点的路径就包含进去了. 首先加上前一个点和当前点的价值 然后看有没有构成三角形,有就再加上 (2)更新答…
题目见option=com_onlinejudge&Itemid=8&page=show_problem&problem=4681">here 题意:给一个序列arr[],你从中选择一些子序列,将子序列的值从左往右依次放到某棵二叉树的叶子节点上,使得除了叶子,全部节点左右子树权和相等.子树的权和 = 子树叶子的权和. 假设存在这样一棵二叉树,选择的子序列就是合法的.问,最长的合法子序列是多少. 思路: 枚举二叉树可能的叶子的最小权(入手点).显然,能和此数一起组成二…
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> #include <cstdio> #include <algorithm> #include <map> //#include <time.h> //#include <ext/pb_ds/assoc_container.hpp> //#includ…
Best Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6338   Accepted: 2461 Description The twenty-first century is a biology-technology developing century. One of the most attractive and challenging tasks is on the gene project,…
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走,一个城市只能工作一次,问pp是否能游览n个城市回到城市1. 分析:这个题想到杀怪(Survival(ZOJ 2297状压dp) 那个题,也是钱如果小于0就挂了,最后求剩余的最大钱数,先求出最短路和 Hie with the Pie(POJ 3311状压dp) 送披萨那个题相似. #include <…
题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间模型.然后简单的状压DP就可以. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #incl…