USACO 2.3 分析

题目一:The Longest Prefix

题目大意:给出一组可以去匹配的字符串,求在给定的字符串中最长可以匹配出的前缀有多长?

算法1:DP

效率:O(200,000*200*10) (实际远远不到)

对于每个位置,去枚举每个字符串,在除去这个串之后的前面的串可以匹配的情况下判断对应的位时候可以匹配,只要有一个可以匹配该位就可以匹配。如果连续遇到不可匹配的数目大于最大可以匹配的长度的时候,就可以退出了。

小经验:用scanf("%c", c)读字符不能跳过回车符和空格

测试时间:

   Test 1: TEST OK [0.000 secs, 3276 KB]
   Test 2: TEST OK [0.000 secs, 3276 KB]
   Test 3: TEST OK [0.011 secs, 3276 KB]
   Test 4: TEST OK [0.022 secs, 3276 KB]
   Test 5: TEST OK [0.022 secs, 3276 KB]
   Test 6: TEST OK [0.054 secs, 3276 KB]

算法2:Trie(单词查找树)(这种算法好像当时一下子就写出来了,但到现在才知道它的名字)

效率:O(200,000)

题目二:Cow Pedigrees

题目大意:求N个结点高度为K的树的种数

算法:DP

效率:O(NK)

s[i][j] = s[left][h]*s[right][j-1] + s[left][j-1]*s[right][h] + s[left][j-1]*s[right][j-1]  1<=h<=j-2,1<=left, right <i and left + right + 1 = i

优化:满足这种条件的树的节点数一定为奇数;最大高度不会超过(N+1)/2;

题目三:Zero Sum

算法:DFS

注意:算的时候要从左向右算,从右向左算稍麻烦;

题目四:Money Systems

算法:DP 背包

小知识:INT64在DEV-C++的g++编译器中printf("%I64d",n),而在GNU中要写成printf("%lld",n)

 

题目五:Controlling Company

算法:DFS/BFS

关键是要理解题目中的规则

(1)不解释(2)不解释(3)你的控制的公司称为子公司,则子公司的子公司仍然是你的公司,也受你的管辖

这道题实质是图论的题目,可以用邻接表来存贮,哪种搜索随便了。第一条规则在搜索时意味着你先把自己作为本体去拓展

猜你喜欢

转载自blog.csdn.net/zjsxzjb/article/details/6182307
2.3