在topcoder中有一个问题,如下所示。我看了一眼源代码,但什么也看不懂。有人能帮我弄清楚这个问题背后的数学背景或公式吗?。
我被要求设计10面带有垂直条纹的旗帜,使用三种颜色:蓝色,橙色,黄色。
我被要求不要有两个相邻的相同颜色的条纹(因为两个蓝色条纹的双条纹旗帜看起来和一个蓝色条纹的旗帜完全一样)。我还被要求不要把黄色和橙色的条纹放在一起,因为这样看起来不好看。
我的目标是最小化我需要使用的条纹的数量。
我可以制作3个不同的单条旗帜。
我可以制作4个不同的双条纹旗帜:
- 自民党
- blue-orange
- 瞳
- 橙蓝色。
我可以制作6个不同的三条纹旗帜:
- blue-yellow-blue
- yellow-blue-yellow
- orange-blue-orange
- blue-orange-blue
- orange-blue-yellow
- yellow-blue-orange。
也就是说,我最多可以使用3条条纹制作13种不同的旗帜。
你的任务是,给定flag的数量,numFlags和一个String[]禁止描述可能不相邻的颜色,返回你需要设计给定数量的不同标志的最小条纹数,最多使用该数量的条纹。
详细说明:
String[] forbidden将按以下方式构造:
1. the colors will be indexed from 0
2. i-th element of forbidden will be the indices of colors that are not allowed to be neighbors of the i-th color
3. each element of forbidden will be a single-space delimited list of numbers without trailing/leading spaces
4. each element of forbidden will have numbers without leading zeroes in increasing order
5. each color will be in the list of forbidden colors of itself
6. rules for forbidden colors are symmetric: if the i-th color can't be a neighbor of the j-th color, then the j-th color can't be a neighbor of the i-th color
at least one pair of neighbors will not be forbidden (if all possible pairs are forbidden, then you can only make one-striped flags)
@Herokiller
问题的约束
- numFlags表示1到10^17之间的数字(注意:numFlags将适合long)
- forbidden包含2 - 10个元素,包括
- forbidden的每个元素将包含1到50个字符,并且仅由数字('0'-'9')和空格(' ')组成
- forbidden的每个元素都以一个数字开始和结束,并且一行不能有2个空格
- forbidden的每个元素的forbidden颜色索引按递增的顺序排列,没有前导零。索引将在0到颜色数减去1(包括 )之间。
- forbidden的每个元素将包含自己的索引,并表示对称关系
- 在forbidden 中不是所有可能的颜色对都被禁止