10 2013 档案
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26981思路:题目的意思是求给定的起点到终点的最短路径序列,并且这个序列的字典顺序最小。我们可以先求最短路,然后对那些在最短路上的点进行深度优先搜索。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 const int MAXN=55555; 11 const int inf=1g[M...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27087思路:题目的意思是求S->T的所有路径中花费总和小于给定的P值的所经过的路径上的最大权值。我们可以从起点做一次SPFA,然后求出起点到所有点的最短路径,然后以终点为起点,将边反向,求终点到起点的最短路,然后枚举每一条边即可,求最大值。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 22222 8 #define
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114思路:首先是floyd预处理出任意两点之间的最短距离。dp[state1][state2][u]表示在该状态state1(已经访问过的景点)、state2(手中有的景点的票)、目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define inf 1<<30 9 #define FILL(a,b) memset
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小值。思路:spfa的应用,更新的时候判断max(dist[u],w(u,v)) 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 555 8 #define inf 1g[MAXN];19 20 void spfa(int vs)21 {22 FILL(mark,false);2...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024题意:求0-(n-1)的经过最多的标记的点的最短路。思路:首先我们可以spfa预处理出起点到标记的最短距离,标记的点到终点的最短距离,然后就是状压dp了,dp[state][u]表示在该状态下到达点u的最短路径。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 555 9 #def...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25956思路:dist[v][0]代表走到点v的最短路,dist[v][1]代表走到点v的次短路(dist[v][0]!=dist[v][1]),然后Dijkstra更新就可以了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 5555 9 #define MAXM 55555510 #define in
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764思路:dp[pos]表示0-pos这段字符串最少分割的回文子串,然后记忆化搜索(判断是否是回文子串的时候也用一个数组来记录是否是回文子串,记忆化搜索)。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 1111 7 #define inf 1r)return 1;17 if(is_ok[l][r]!=-1)return is_ok[l...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26913思路:水题一枚,就是求最大独立集。最大独立集=顶点数-最大匹配。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 1111 8 #define FILL(a,b) memset(a,b,sizeof(a)) 9 10 int n,m,ly[MAXN];11 bool mark[MAXN];12 13 vectorg[MA
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4281题意:给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而每个裁判最多能回答M分钟的问题。题目分两问,第一问是如何分配可以使使用的裁判数最少,第二问是如何分配裁判,使裁判走过的总路程和最少,裁判一开始都在1,最终也要回到1。思路:首先我们可以把符合条件的集合预处理出来,然后对于第一问,可以用状态压缩解决,dp[state]表示该状态下的最少裁判数,对于第二问,就是多旅行商问题了,dp[i][j]表示状态为i,在位置j的最小花费,然后开一个best数组来保存
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915题意:求一个数不断地除以他的因子,直到变成1的时候 除的次数的期望。思路:设一个数的约数有num个,E[n] = (E[a[1]]+1)/num+(E[a[2]]+1)/num+...+(E[a[num]]+1)/num+1 ,而a[num]==n,于是整理得:E[n]=(E[a[1]]+E[a[2]]+...+E[a[num-1]]+num)/(num-1)。然后预处理出所有的结果。 1 #include 2 #include 3 #include 4
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25914思路:dp[state]表示当前状态下要消耗的最小的shots。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define inf 1<<30 7 8 int n,val[17],dp[1<<17]; 9 char map[17][17];10 11 int main()12 {13 int _case,t=1;14 scanf(&quo
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25913思路:易证存在一条从左上角到右下角的折线,沿着格子边缘的...其中处于折线下方的全部运送到左边去,其他运送到上边去...那么这个折线就相当于从上面走到下面得分最大...直接dp就可以。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define FILL(a,b) memset(a,b,sizeof(a)) 7 8 int n,m,Ura[555][555],R.
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26881思路:我们可以二分最大危险度,然后建图,由于每个休息点只能用一次,就要拆点,将每个休息点拆点,边容量为1,代表只能使用一次,然后跑最大流验证。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 222 9 #define MAXM 222222 10 #define inf 1que...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25909思路:好久没接触数位dp了=.=!,搞了这么久!一类记忆化搜索。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define FILL(a,b) memset(a,b,sizeof(a)) 7 typedef long long ll; 8 9 ll dp[33][2][33];10 int n,digit[33];11 12 13 ll dfs(int pos.
阅读全文
摘要:题目链接:http://lightoj.com/volume_showproblem.php?problem=1031思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define inf 1<<30 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 int dp[111][111],sum[111];10 int n,x;11 12 int dfs(int l,int r
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26864思路:首先是spfa预处理出每个'G'到'H'的最短距离,然后就是二分最大距离,最大匹配验证即可。PS:这道题一开始没什么思路,然后想先最简单的spfa预处理写一下吧,然后写着写着就突然豁然开朗,有思路了!然后就AC了! 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26870思路:由于溢出问题,wa了半天,还以为构图错了呢,查了半天!一看到最大最小问题,就应该想到二分,二分最大距离,然后建图跑最大流验证。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8 #define MAXM 222222 9 #define inf 1que; 38 que.push...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26869思路:题目还是比较水的,由于点也有容量,则必须拆点,然后跑最大流。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8 #define MAXM 222222 9 #define inf 1que; 38 que.push(vt); 39 level[vt]=0; 40 ...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25902 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 typedef long long ll; 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 ll dp[77][77];10 int n;11 char str[77];12 13 ll dfs(int l,int r)14 {15 if(dp[l][r]!=-1)...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887题目大意:给定的一个某进制下的排列,问它的全排列有多少个能够整除给定的十进制下的数字k。思路:记忆化搜索,dp[state][r]表示在某状态下被k除余数为r有多少个。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 typedef long long ll; 9
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844思路:首先预处理出点在同一直线上的所有的点集状态(dp[i][j]),然后记忆化搜索。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define inf 1<<30 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 struct Point{10 int x,y;11 }point[17];12 13 int
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25843思路:我们可以发现题目与点的X坐标没有关系,于是可以直接对y坐标进行排序,然后进行dp,dp[i][j]表示以j个区间覆盖前i个点的最大覆盖数。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 111 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 int n,w,k,dp[MAXN][MAXN].
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26868思路:拆点,容量为最多能跳的步数,然后设立一个超级源点,源点与各点两连边,容量为一开始的企鹅数,最后就是枚举汇点了,跑最大流验证即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 222 9 #define MAXM 222222 10 #define inf 1que; 40...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25839思路:第一小问可以很快求出了,两个字符串的长度-LCS,然后第二问就要记忆化搜索了,dp[i][j][l]表示A串的前i个和B串的前j个组合,长度为l的组合数。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 33 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 typedef long long ll
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837思路:状态压缩+记忆化搜索。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define FILL(a,b) memset(a,b,sizeof(a)) 7 8 int dp[1<<17],map[17][17]; 9 int n;10 11 int dfs(int state,int m)12 {13 if(state==0)return 0;14
阅读全文
摘要:题目链接:http://poj.org/problem?id=1463思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 2222 8 #define FILL(a,b) memset(a,b,sizeof(a)) 9 10 int n,dp[MAXN][2];11 vectorg[MAXN];12 13 int dfs(int u,int
阅读全文
摘要:题目链接:http://poj.org/problem?id=2378思路:num[u]表示以u为根的子树的顶点个数(包括),如果去掉u之后u的每棵子树都小于等于n/2,则选择u。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 11111 8 #define FILL(a,b) memset(a,b,sizeof(a)) 9 10 int n,num[MAXN];11 bool mark[MAXN];12 vector >g;13 14 int df
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25830‘思路:类似与数塔问题,自底向上处理,输入的时候稍微注意一下就可以了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 222 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 int g[MAXN][MAXN],dp[MAXN][MAXN];10 int n;11 12 int main()13 .
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26882思路:一开始把题意理解错了,还以为是简单路径,然后仔细一看发现是一条路径,意思就是说从起点出发,把所有的点走一遍,于是就要考虑强连通分量,因为对于同一个强连通分量的点是相互可达的,于是我们可以先缩点,建新图,统计新图中顶点的入度与出度的关系,判断即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #inc...
阅读全文
摘要:题目链接:http://poj.org/problem?id=1935思路:首先我们考虑从源点出发到所有自己想要经过的点然后在回到源点sum,显然每条边都必须经过源点(这个我们可以一次dfs求出),但题目的意思是可以不用回到源点,那么我们可以再求源点到所有要经过的点的最远距离ans,于是答案便是sum-ans. 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 55555 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 struct E.
阅读全文
摘要:题目链接:http://poj.org/problem?id=2486思路:经典的树形dp,想了好久的状态转移。dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从i出发走了j步最后回到i。于是我们把所有到情况归结为3种:1、从u(v是其中一颗子树)出发,走了j步,最后停在了v,则有dp[u][j+1][0]=max(dp[u][j+1][0],dp[u][j-k][1]+dp[v][k][0]);(从u->v多走了1步).2、从u出发,走了j步,最后停在了u的另一棵子树上,则有dp[u][j+2][0]=max(dp[u][j+2][0],dp[u][
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25911思路:强连通缩点,在新图中找入度为0的点的个数即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 using na...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3140思路:简单树形dp题,dp[u]表示以u为根的子树的人数和。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 using namespace std;15 #define MAXN 11111116 #define inf 1PP;20 template inline T Get_MIN
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662思路:典型的树形dp,处理的时候类似于分组背包,dp[i][j]代表以i为根的树取j个分支获得的最大值。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 111 8 9 struct Edge{10 int v,w;11 Edge(){}12 Edge(int vv,int ww):v(vv),...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898思路:我们可以给定有直接边相连的两点的距离为1,那么就是求源点出发能够走偶数步的所有的点的个数。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 111 9 10 int n,m;11 vector >g;12 bool even[MAXN],odd[MAXN];13 14 void bfs(
阅读全文