上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 34 下一页
摘要: 都是求最大二分匹配的题目,只不过比模板题稍微灵活了一点,需要将题目进行一定的转化pku2446【题目大意】: r行c列的棋盘,现在要用1x2的骨牌来覆盖整个棋盘。骨牌不能重叠,且棋盘上有的方格不能放骨牌。问能不能将棋盘完全覆盖【算法分析】:关键是建立二分的模型,用1x2的骨牌来覆盖棋盘其实隐含了一个性质,一张骨牌覆盖相邻的方格。就是说一次我们选择了两个方格,这两个方格相邻。把棋盘画成黑白棋盘,就转换成了二分图。每个方格可以和周围几个方格连线,寻找到最大的匹配数。比较最大匹配数*2是否和之前的空白方格数相等。另外可以发现一个剪枝,空白方格如果是奇数个,就肯定不能覆盖。pku2446#includ 阅读全文
posted @ 2011-08-23 02:06 枕边梦 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 二分图:二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y。二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。最大匹配:图中包含边数最多的匹配称为图的最大匹配。完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配。二分图匹配基本概念:未盖点设VI是G的一个顶点,如果VI不与任意一条属于匹配M的边相关联,就称VI是一个未盖点。交错轨设P是图G的一条轨,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是交错轨。可增广轨(增广路)两个端点都是未盖点的交错轨 阅读全文
posted @ 2011-08-23 00:26 枕边梦 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 关于二分匹配,一开始总下不了手,应该说,不知道该从何下手,课件上就很直接的就引入匈牙利算法,看了好久之后还是一样一头雾水,这让我情何以堪啊!!不过,跟这算法走一遍之后,感觉有些许的理解这个算法了,问题的关键在与寻找增广路径,当图中不存在增广路径时,表明已经是最大匹配了这里面的四道题目,有三道是完全的模板题,pku2239需要稍微转换一下,题目中说,在course和每周的12个教室进行匹配,不发生冲突,其实也就是总共300个courses和7*12个教室进行匹配,只需要在输入的时候稍微的修改一下,a 表示course,q days 在p class上课,即表示在mat[a][12*(p-1)+q 阅读全文
posted @ 2011-08-22 21:15 枕边梦 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 这倆道题目都是求最长递增子序列,只不过各自都有点点区别hdu 1025题意:•有两行点, 每行n个. 第一行点和第二行点是一一对应的, 有线连接, 如下图所示 •选择尽量多的线, 两两不交叉分析:•设与第1行第i个点对应的是第2行第f[i]个点 •假设i<j, 两条线(i, f[i])和(j, f[j])的充要条件是f[i]<f[j], 因此问题变成了 求f的最长递增子序列了hdu1025#include<iostream>#include<algorithm>#define MAXN 500010using namespace std;int a[MAXN 阅读全文
posted @ 2011-08-21 16:25 枕边梦 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 这倆道是一样的题目,题意就是将一个字符串转变为回文串的最少添加数有俩种方法:1.求正串和反串的最长公共子序列,再用原先串的长度相减即可;2.令c (i,j)表示将子串aiai+1…aj变成回文词的最小添加字符数。则这此问题就是要求c(1,n)。 •c(i,j)满足如下递推关系: 从代码可以看出,俩种方法的效率想差很大第一种方法#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){ char s1[5010],s2[5010]; int s[2][ 阅读全文
posted @ 2011-08-21 09:23 枕边梦 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 都是同一类型的题目,求最长公共子序列pku1458#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){ char s1[1000],s2[1000]; int s[1000],t[1000],l1,l2; while(scanf("%s %s",s1,s2)==2) { l1=strlen(s1); l2=strlen(s2); memset(s,0,sizeof(s)); memset(t,0,sizeof(t)); fo 阅读全文
posted @ 2011-08-20 23:20 枕边梦 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 题目分析:•这一题是LCS,只是一个变形而已,有三种情况 (dist[ ][ ]为两符号所得的分数):•1、s1取第i个字母,s2取“ - ”:dp[i][j] = dp[i-1,j] + dist[s1[i],'-'];•2、 s1取“ - ”,s2取第j个字母:dp[i][j] = dp[i,j-1] + dist['-',s2[j]];•3、 s1取第i个字母,s2取第j个字母:dp[i][j] = dp[i-1,j-1] + dist[s1[i],s2[j]]•即dp[i,j]=max( dp[i-1,j] + dist[s1[i],'-' 阅读全文
posted @ 2011-08-20 21:16 枕边梦 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 额,比较基础的模板题,求最长公共子序列这里用滚动数组来保存中间值,因为只需要保存相邻俩行的值.pku的1936只需要加一步判断即可,判断最长公共子序列长度是否等于s1 的长度递推公式为:if(s1[i]==s2[j]) c[i,j]=c[i-1,j-1]+1;else c[i,j]=max(c[i-1,j],c[i,j-1])pku1936#include<iostream>#include<string>#include<algorithm>#define maxn 100005using namespace std; char s1[maxn],s2[m 阅读全文
posted @ 2011-08-20 15:32 枕边梦 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,就是找出一棵最大边值与最小边值差值最小的生成树,首先,从i=0开始枚举以当前边为最小用kruskal 算法求最小生成树,找出最小的差值本来是1A的,不过那个时间500+ms 实在太难接受了,所以一直在剪枝,中间WA了几次,最后,嘻嘻,如愿以偿了,47ms,主要是减少不必要的循环排完序之后,自然是开始枚举生成树的起始边1)若以当前的起始边e[i]用kruskal算法求出的生成树是非联通的,则不用枚举了,因为之后也没法形成联通的生成树了2)在kruskal算法过程中,若出现边值与起始边值的差值大于已求得的最小差值ans,则也可以退出循环了,但还是要继续枚举起始边,退出的是kruskal 阅读全文
posted @ 2011-08-20 14:17 枕边梦 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给你n个水库,告诉你每个水库的xy坐标(米)和这个水库的花费。如果两个水库需要连接,连接的费用是这两个水库的高度差的绝对值。让你连接一些水库,让所有的水库都能到达1号水库并且只有一条通路(就是一棵树)。然你使每米的花费最少(就是总花费 比 总长度)解题报告:实际上就求一棵最小比率生成树,黑书上介绍的挺详细的,就是在代码实现上有点困难有俩种方法实现,一种是二分法,不过在求上下界方面有点难,并且慢很多,一种是用迭代法,标准的01分数规划,不断的逼近迭代最优解;关于构造式子以及用二分法实现,这个博客上解答的很详细http://hi.baidu.com/zzningxp/blog/item/ 阅读全文
posted @ 2011-08-20 10:17 枕边梦 阅读(597) 评论(1) 推荐(0) 编辑
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 34 下一页