USACO2.3题目简析

chunlvxiong的博客


T1:Longest Prefix

     题意:给你不超过200的单词,每个单词长度不超过10,你可以将这些单词拼在一起组成新的单词,给出串S(长度不超过200000),问能构成S的最长前缀长度是多少。

  很容易想到暴力:你穷举S的每个位置i,然后穷举所有的单词,看看此单词(设该单词长度为len)能否与s[i-len+1]..s[i],若能,且i-len这个前缀能够组成,那么该前缀也可以组成。时间复杂度O(200000*200*10)=O(4e8)-->理论上要T(实际上不会)。

  你可以利用trie进行优化,把输入进来的字符串倒序建立一颗trie树,然后对于每个位置i,直接从i寻找到i-9,一旦发现某个位置有单词且i-(该单词长度)这个前缀能够组成,那么表明该前缀也可以组成。时间复杂度O(200000*10)=O(2e6)。

T2:nocows

    题意:N个点(3≤N<200)高度为K(1<k<100)的二叉树(每个节点的度只能是0或2),有几种可能情况?输出答案除以9901后的余数。

  考虑用DP解决此题,用dp[i][j][k]表示高度为i,有j个节点,最底层有k个节点的方案数。

  dp[i][j][k]=Σdp[i-1][j-k][x]*C(x,k/2)

  其中C函数可以预处理好

  看上去这个算法时间复杂度是O(N^3*K)的。

  但是:

  1、层数会限制总结点数以及底层节点数(虽然这个影响不大,因为后来层数高达100)

  2、限制条件很多,你会发现j必然是个奇数,而i>=2后k必然是个偶数,同时k<=j,对于x的限制更多:2x>=k && x<=j-k && x是个偶数。

  所以实际复杂度远不到这个值,总时间复杂度足够了。

  然而USACO题目的内存限制是16MB……所以开滚动来压缩空间。然后你才能A掉此题。

T3:Zero Sum

  题意:给定一个等式1 2 3……n(3≤n≤9),在空位置加入"+"号、"-"号,或不加符号,最后输出所有使得整个等式为0的方案(按"+","-"," "这样的字典序输出)。

  这题没什么好说的,直接爆搜,时间复杂度O(3^n)。

T4:Money Systems

  题意:有V种货币(V≤25),需要用它们组成N元钱,共用几种方案?

  容易想到DP,用dp[i][j]表示前i种货币组成j元钱的方案数,那么dp[i][j]=Σdp[i-1][j-a[i]*k]。

  这样复杂度是O(N^2*V)的,理论上会T(实际上可以AC,而且跑的很快)。

  受无限背包问题的启发,我们允许同维的继承,但是注意先要更新小的,再更新大的。

  可以将状态降为一维,届时直接dp[j]+=dp[j-a[i]]即可。

  这样做时间复杂度O(NV),就可以顺利AC了。

T5:Controlling Companies

  题意:如果公司A和B满足下列三个条件中的一个,那么就说A控制了B:

  1、公司A = 公司B。

  2、公司A拥有大于50%的公司B的股票。

  3、公司A控制K(K >= 1)个公司,记为C1, ..., CK,每个公司Ci拥有xi%的公司B的股票,并且x1+ .... + xK > 50%。

  给出一些N条公司之间的控制信息(N≤100),输出所有的(A,B)表示A公司控制了B公司。公司总数不超过100。

  很明显是个一个BFS的题目,以每个点为起点进行BFS,首先让该点入队,然后更新其他所有的点的份额,如果发现一个点被占份额超过50%,那么说明这个点已经被控制,将其入队,如此做下去即可。时间复杂度O(N^3)。

 

posted @ 2017-08-17 16:38  chunlvxiong  阅读(179)  评论(3编辑  收藏  举报