【2012百度之星/初赛上】D:轮子上的度度熊

描述:百度楼下有一块很大很大的广场。广场上有很多轮滑爱好者,每天轮滑爱好者们都会在广场上做一种叫做平地花式轮滑的表演。度度熊也想像他们一样在轮上飞舞,所以也天天和他们练习。

因为度度熊的天赋,一下就学会了好多动作。但他觉得只是单独的做动作很没意思,动作的组合才更有欣赏性。

平地花式轮滑(简称平花),是穿轮滑鞋在固定数量的标准桩距间做无跳起动作的各式连续滑行。度度熊表演的舞台上总共有N个桩,而他也从自己会的动作中挑出M最好看的。

但事情并没有这么简单。首先每个动作因为复杂度不同,所以经过的桩的个数也不尽相同。

然后,为了保持连贯性,有些动作是接不起来的,所以每个动作都有他前面能接的一个动作的列表。更有甚者,有的动作要考虑前两个动作才能确定是否能做出来。因此动作被分为三类:0型动作,无论前面是什么动作都能做出来,所以这种动作也能作为起始动作;1型动作,要考虑前面那个动作才能确定是否能接上;2型动作,要考虑前面两个动作才能确定是否能接上。

最后,评分也很复杂。每个动作有个单独得分,只要在表演过程中做了这个动作就能获得这个分数。有些动作的组合也非常好看,也会有相应的得分。不过要获得某个组合的得分就要在过程中完成这组组合中所有的动作,但是,这些动作既不要求按顺序完成也不要求连续完成。当然,大家不喜欢重复的动作,所以同一个动作和同一个组合不会获得两次得分。

举个例子,总共有10个桩,有以下几个动作:

动作1:0型,需要3个桩,得分5。

动作2:0型,需要4个桩,得分4。

动作3:1型,能接在动作1或者动作2后面,需要6个桩,得分10。

动作4:2型,要接在动作2+动作1后面,需要4个桩,得分30。

组合1:(动作1,动作2,动作4),得分15。

组合2:(动作1,动作3),得分10。

组合3:(动作2,动作3),得分5。

能配成的方案不少,但有这么几种方案是不行的:

1、动作2+动作1+动作4,虽然,动作4分数很多,而且1,2,4的组合还能额外获得15分。但是,这个方案总共要用4+3+4=11个桩,超过了总桩数,所以不行。

2、动作1+动作3,同样也完成了一个组合,也满足各个动作要求的限定条件。但是做完后,只过了9个桩,没有完成整个表演。这样度度熊会很尴尬的。所以这样的方案也不行。

最优方案应该是动作2+动作3,满足桩数要求,也满足各个动作前置限定条件。最后得分:单项动作14分+组合加分5分=19分。

虽然,度度熊一下就算出来自己应该怎么表演了。但是他还是想考考精通编程的你。

输入

一开始一个整数T(1 <= T <= 5),表示有T组数据,每个数据如下格式:

第一行有三个整数,N,M,P。分别表示桩数、动作数和组合数。

第二行M个0~2的整数,表示每个动作的类型。

第三行M个整数,表示每个动作需要使用的桩数。

第四行M个整数,表示每个动作单项的分数。

接下来P(P<=1024)行,每行描述一个组合。每行的前两个数X,Y,X表示组合中总共有X个动作,Y表示组合能获得的分数。后面接X个数,表示组合中包含的X个动作的编号。

再接下来分为M块,第i块描述第i个动作的前置条件。

若第i个动作是0型的,那么它没有前置条件。所以对应的块是一个空行。

若第i个动作是1型的,对应的块是一个M的01序列。若这个序列是Aj的话,Aj=1表示动作i可以接在动作j后面。

若第i个动作是2型的,对应的块是一个MxM的01矩阵。若这个序列是Aj,k的话,Aj,k=1表示动作i可以接在动作j+动作k后面。

输出

对于每个数据,输出包含一个整数,表示度度熊能获得的最高分数。

样例输入

1

10 4 3

0 0 1 2

3 4 6 4

5 4 10 30

3 15 1 2 4

2 10 1 3

2 5 2 3

1 1 0 0

0 0 0 0

1 0 0 0

0 0 0 0

0 0 0 0

样例输出

19

提示

保证至少有一个方案满足要求。

对于100%的数据,1≤N≤100,1≤M≤10,所有分数之和在32位有符号整数范围之内。每个动作至少需要过1个桩。

代码:

你可能感兴趣的:(编程,百度)