摘要:
都是同一类型的题目,求最长公共子序列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 阅读全文
摘要:
题目分析:•这一题是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],'-' 阅读全文
摘要:
额,比较基础的模板题,求最长公共子序列这里用滚动数组来保存中间值,因为只需要保存相邻俩行的值.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 阅读全文
摘要:
题意很简单,就是找出一棵最大边值与最小边值差值最小的生成树,首先,从i=0开始枚举以当前边为最小用kruskal 算法求最小生成树,找出最小的差值本来是1A的,不过那个时间500+ms 实在太难接受了,所以一直在剪枝,中间WA了几次,最后,嘻嘻,如愿以偿了,47ms,主要是减少不必要的循环排完序之后,自然是开始枚举生成树的起始边1)若以当前的起始边e[i]用kruskal算法求出的生成树是非联通的,则不用枚举了,因为之后也没法形成联通的生成树了2)在kruskal算法过程中,若出现边值与起始边值的差值大于已求得的最小差值ans,则也可以退出循环了,但还是要继续枚举起始边,退出的是kruskal 阅读全文
摘要:
题目描述:给你n个水库,告诉你每个水库的xy坐标(米)和这个水库的花费。如果两个水库需要连接,连接的费用是这两个水库的高度差的绝对值。让你连接一些水库,让所有的水库都能到达1号水库并且只有一条通路(就是一棵树)。然你使每米的花费最少(就是总花费 比 总长度)解题报告:实际上就求一棵最小比率生成树,黑书上介绍的挺详细的,就是在代码实现上有点困难有俩种方法实现,一种是二分法,不过在求上下界方面有点难,并且慢很多,一种是用迭代法,标准的01分数规划,不断的逼近迭代最优解;关于构造式子以及用二分法实现,这个博客上解答的很详细http://hi.baidu.com/zzningxp/blog/item/ 阅读全文