【问题标题】:Explaining "counting the number of subgrids" solution in the Competitive Programming Guide Book在竞争编程指南书中解释“计算子网格的数量”解决方案
【发布时间】:2020-01-08 19:25:26
【问题描述】:

我在竞争性程序员手册中看到了对某个问题的解释,但我并不真正理解它是如何包含该问题的所有解决方案的,我想知道是否有人可以为我解释一下。如果我遗漏了有关问题的某些内容,我不确定我是否只是不正确理解解决方案。问题和解决方案的图片如下:

根据我的理解,问题只是要求子网格(构成 a x b 或 a x a 框的四个角),其中每个角都是黑色的。他们的解决方案(据我了解)是您计算每列中黑盒对的数量,然后使用公式 count(count-1)/2 计算总数。如果我理解正确,我的问题是这如何涵盖所有情况?我脑海中的具体例子是这样的:

X O O O O O
O X O O O O
O O X O O O
X O O O O O 
O X O O O O
O O X O O O

X X X O O O
O O O O O O
O O O O O O
X X X O O O 
O O O O O O
O O O O O O

使用提供的解决方案,这两个框不会给出相同的答案吗?您将得到两个输入的 count = 3,尽管它们具有不同的解决方案,但每个输入的总输出为 3。我只是觉得在解决方案方面我遗漏了一些东西。

感谢您的帮助。

【问题讨论】:

  • 您独立计算每对行的黑盒对数,然后在对结果求和之前应用公式。在第一种情况下,我们有三对分别计数为 1 的行。在公式总和为 0 之后变成 1*0/2 = 0。在第二种情况下,我们有一对计数为 3 的行,在公式之后得到 3*2/2 = 3。跨度>
  • 天哪,我太笨了。谢谢吨!我只是有点忘了他们提供的代码只是内部循环而不是整个事情,所以 count(count-1)/2 在每一行的末尾进行评估。再次感谢您!
  • 能告诉我书名和作者吗?
  • @Evg 竞争程序员手册,作者 Antti Laaksonen。可在线免费获取:cses.fi/book/book.pdf
  • @user2582118,谢谢!

标签: c++ algorithm subgrid


【解决方案1】:

以伪代码形式给出的算法实际上只是内部循环。如前文所述,外部循环是对所有行对的循环。

int count_subgrids(const int** color, int n)
{
    int subgrids = 0;
    for(int a=0; a<n; ++a)
        for(int b=a+1; b<n; ++b) {    // loop over pairs (a,b) of rows 
            int count=0;
            for(int i=0; i<n; ++i) {  // loop over all columns
                if(color[a][i]==1 && color[b][i]==1)
                    ++count;
            }
            subgrids += ((count-1)*count)/2;
        }
    return subgrids;
}

在您的第一个示例中,count=0 用于任何一对行,因此subgrid 仍然是0。在您的第二个示例中,有三对行,即(a,b)=(0,1)(0,2)(1,2),其中count=2,这样最后subgrid=3

【讨论】:

  • 谢谢! n314159 对我的 OP 的评论也解释了同样的事情,但感谢您写出来并解释,很高兴看到完整的代码并且真的很有帮助。
  • 不只是一对行 (0,3) 你得到计数 = 3。@Walter
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多