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