Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “解释”;“计算子网格的数量”;竞争编程指南中的解决方案_C++_Algorithm_Subgrid - Fatal编程技术网

C++ “解释”;“计算子网格的数量”;竞争编程指南中的解决方案

C++ “解释”;“计算子网格的数量”;竞争编程指南中的解决方案,c++,algorithm,subgrid,C++,Algorithm,Subgrid,我在《竞争程序员手册》中看到了一个问题的解释,但我真的不明白它是如何包含问题的所有解决方案的,我想知道是否有人能为我解释一下。如果我遗漏了问题的某些方面,我不确定我是否只是没有正确理解解决方案。问题和解决方案的图像如下所示: 从我的理解来看,问题只是要求子网格(四个角组成一个a x b或a x a框),其中每个角都是黑色的。他们的解决方案(据我所知)是计算每列中黑盒对的数量,然后使用公式count(count-1)/2计算总数。如果我理解正确的话,我的问题是,这是如何涵盖所有情况的?我脑海中有

我在《竞争程序员手册》中看到了一个问题的解释,但我真的不明白它是如何包含问题的所有解决方案的,我想知道是否有人能为我解释一下。如果我遗漏了问题的某些方面,我不确定我是否只是没有正确理解解决方案。问题和解决方案的图像如下所示:

从我的理解来看,问题只是要求子网格(四个角组成一个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

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


谢谢您的帮助。

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

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;
}
int count\u子网格(常量int**color,int n)
{
int子网格=0;

对于(int a=0;a您独立计算每对行的黑盒对数,然后在求和结果之前应用公式。在第一种情况下,我们分别计算了三对计数为1的行。在将公式相加为0后,这将成为1*0/2=0。在第二种情况下,我们有一对计数为3的行,其中h在公式后给出了3*2/2=3。哦,我的上帝,我太笨了。谢谢你!我只是有点忘记了他们提供的代码只是内部循环,而不是全部,所以计数(count-1)/2在每一行的末尾进行评估。再次感谢!你能告诉我这本书的名字和作者吗?@Evg Competitive Programmer's Handbook由Antti Laaksonen编写。它可以在网上免费获得:@user2582118,谢谢!谢谢!n314159对我的作品的评论也解释了同样的事情,但谢谢你写出来并解释,是nice希望看到代码的完整性,这确实很有帮助。
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;
}