- 博客(20)
- 收藏
- 关注
原创 hdu2196 Computers 树形DP
这题自己没想出来,,连续做了几天的树形DP结果反而思路被限制了,现在想来这题其实不难= =!主要是既要存 i 到叶子的最大值以及取得这个最大值的关联儿子节点,还要存取得次大的值这些信息。因为最后扩展到全部节点的时候可能出现 j 的父亲节点 i 恰好是 i 取得max的关联儿子节点,这样状态就无法转移了,于是我们就需要一个次大值的信息来解决这种问题。(最大与次大严格不重复)接下来就很简单了 #in
2014-03-05 20:00:50 805
原创 HDU2224 TSP(货郎担)问题DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2224 很经典的TSP一类问题了:给出平面上的N个点(1~N),让你从 1 号点出发走到最右端的点 N ,再返回 1 ,要求中途不能重复走某个点而且必须把所有点全走一遍,求最小的总路径。 我们大致可以这样想:把折返问题拆分成两次从 1 到 N 的路径当然还得满足题目要求(中途不能重复走某个点而且必须
2014-03-03 17:21:15 2072
原创 poj1947 树形DP
应该是属于偏简单的一类树形DP了。思路很明确,dp[ i ][ n ]表示以i为根节点的子树中取n个点的子树所需的最小代价(所需删的边数)。那么对于一个节点 i 有dp[ i ][ 1 ] = 0,那么对于其儿子节点 j 就有大致两种情况了:①根本不取 j 子树上的,此时代价为dp[ i ][ n ]+1(即删除 i 到 j 的这条边);②取 j 子树上的 k 个节点那么代价就是dp[ i ][
2014-03-02 23:03:33 786
原创 hdu3593 树形背包
根据题意我们可以判断出很明显是一个树形的DP,但是从何入手呢。 显然我们还是可以按照对于某一个点分取和不取两种状态,那么由于闲置费用的引入我们很容易就想到了背包问题(体积限制)。我们不妨假设0为根节点。显然对于每一个非叶子节点 i 以他为根的子树在费用dp[ i ][ v ]的最大收益就可以通过其儿子节点来求:如果他的儿子是个叶子节点,那么要么取要么不取,就是0、1背包的问题了;如果儿子不是
2014-03-02 00:05:49 1350
原创 ZOJ3734 树形DP
很有意思的一道树形DP。关键在于变量的设置。根据翻转的性质,我们设dp[ i ][ 0 ]代表以 i 为根的子树like 比 candle多多少,dp[ i ][ 1 ]则表示以 i 为根的子树like 比 candle少多少。所以每次翻转都是dp[ i ][ 0 ]和dp[ i ][ 1 ]的转换。很有意思! #include "iostream" #include "cstdio" #i
2014-03-01 16:00:37 1246
原创 hdu 1054 最小点覆盖
这题就是运用到了二分图的三个重要结论之一: 最小点覆盖数: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数 最小路径覆盖=最小路径覆盖=|N|-最大匹配数 用尽量少的不相交简单路径覆盖有向无环图G的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则
2014-03-01 14:38:50 1007
原创 hdu2412 树形DP
个人做的第一道树形DP,很经典也很有代表性。 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题目大致意思就是任意一个节点 i 不能与它的父亲节点 j 同时被取。问最多能去多少个节点。 对于每个节点显然有两种状态,要么取、要么不取,所以定义dp[ 0 ][ i ] 和 dp[ 1 ][ i ]分别代表不去 i 和 取 i 所
2014-03-01 14:34:19 587
原创 hdu3306矩阵快速幂讲解
矩阵快速幂可以说是数论题中较为常见也是较为简单的一部分。原理很直接,就是根据题目所给的公式推出递推公式,用矩阵乘法表示,然后套用快速幂模板得出结果。 比如hdu3306--Another kind of Fibonacci Description As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N) =
2014-02-23 16:18:57 1182
原创 多校联合赛(一) 1008 Park Visit
题目是这样的 Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The park is beautiful - but large, indeed. N feature spots in the park are connected by exactl
2013-07-23 20:35:24 703
原创 多校联合赛(一)1009 I-number
好长时间没写博客了,一想起“水可三日不饮,饭可七日不食,而程不可一日不编”,还是回顾一下最近的内容,下午打了场多校说下这道A下的第一题。 Problem Description The I-number of x is defined to be an integer y, which satisfied the the conditions below: 1. y>x; 2.
2013-07-23 20:29:18 721
转载 C语言位运算详解
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作 运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。 C语言提供的位运算符列表: 运算符 含义 描述 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
2013-07-12 21:12:33 613
原创 最小生成树不得不说的一题
这题又做了大半天。。题目如下 Description Once again, James Bond is on his way to saving the world. Bond's latest mission requires him to travel between several pairs of cities in a certain country. The coun
2013-07-12 16:26:51 776
转载 网络流之SAP算法
在SAP算法中,我们定义每个顶点的距离标号(Distance Labels),即残留网络中这个点到汇点的距离。然后,我们只在距离标号相邻的点间寻找增广路径。如果从一个点出发没有容许边,就对重标记并回溯(类似预流推进)。首先介绍一些定义: 残留容量:容量-流量。即,残留容量r[i,j]=c[i,j]-f[i,j]。如果只求流值,则在网络流算法中只需记录残量,而不必记录容量和流量。 残留边
2013-07-10 21:36:39 865
转载 网络流之Dinic算法
Dinic 算法的基本步骤为: 1) 计算残余网络的层次图。我们定义 h[i] 为顶点 i 距离源 S 所经过到最小边数,求出所有顶点的 h 值,h[] 值相同的顶点属于同一层,这就是网络的层次图。 2) 在层次图上进行 BFS 增广,直到不存在增广路径。这时求得的增广路径上顶点是分层的,路径上不可能存在两个顶点属于同一层,即 h[i]== h[j] (i!= j )。同时,求得层次图
2013-07-10 21:08:53 807
原创 Poj3308 Paratroopers(最小割)
其实最开始看没啥思路,还以为是DP什么的。冷静分析一下,我们可以把横竖行分开来看,那么有一个伞兵就在左右脸上一条线(流量无穷),这不是个二分图吗?! 然后就很自然想到加上一个源点一个汇点就成了网络流求最小割,也就是最大流的问题上来。NICE。 #include "stdio.h" #include "iostream" #include "stdlib.h" #include "queue"
2013-07-09 21:20:46 799
转载 Poj 3080 Blue Jeans
strstr神器不解释,复杂度相当于KMP,但就是一行的事儿,你懂的。 #include #include void work(); char str1[61],str[9][61],ans[61],temp[61],len; void work() { int i,j,k,n; scanf("%d",&n); n--; ans[0]=127; ans
2013-07-08 21:59:23 854
原创 Poj1961 Poj2406 最短循环节
POJ1961: 先是用KMP“预处理"得出pre(程序中我习惯用p数组)。 那么关键就在于 (i+1)%(i-pre[i]) ==0 出现循环的判断上。怎么理解呢?这是就把数组 str 分成 (i+1) / (i-pre[i]) 个部分,由pre性质可以看出 这些部分全部相等 ,也就是最小循环节,不太清楚可以在数轴上画几笔即可。这就是本题的关键所在。 #include "stdio.
2013-07-08 13:55:29 731
转载 KMP算法简析
这类算法在网上看到很多,各执一词,晕~最后看见这篇Matrix67的博客 解释的有趣生动就转下来了。 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I
2013-07-08 10:18:22 655
原创 Poj 1511- Invitation Cards(Spfa+邻接表)
这题第一感觉就是Floyd:方便快捷,也很直接。sum+=d[1][i]+d[i][1] (i---- 1->n); 但显然悲剧超时,然后就想到Floyd的优化算法Spfa。一般的都会用上队列,比如vector确实好用,但这题太坑,卡vector超时,然后听取了其他人的想法用邻接表解决了。 #include #define MAXN 1000010 #define MOD 1000007
2013-07-07 10:16:32 848
转载 Spfa用法简介
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。 这个算法,简单的说就是队列优化的bellman-ford,利用了
2013-07-07 09:00:28 842
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人