C++ 用红色着色m个灰色块的计数方法,其中红色块应分组计数至少为n

C++ 用红色着色m个灰色块的计数方法,其中红色块应分组计数至少为n,c++,C++,我想计算我用白色给黑色块着色的方法,其中红色块应该在计数至少为j的组中。这是一个可能的程序: #包括 #包括 int count_rec(int m,int n,std::vector&cache) { //计数从1开始,表示未填充块 int c=1; //i=当前块的起始位置 对于(int i=0;i让C(m)为m块的着色方式数(固定n) 如果m=n,C(m)=C(m-1)+1+sum(C(m-i-1)表示i=n..m-1)。重写此代码将给出C(m)=1+C(m-1)+sum(C(i)表示i=

我想计算我用白色给黑色块着色的方法,其中红色块应该在计数至少为j的组中。

这是一个可能的程序:

#包括
#包括
int count_rec(int m,int n,std::vector&cache)
{
//计数从1开始,表示未填充块
int c=1;
//i=当前块的起始位置
对于(int i=0;i让
C(m)
m
块的着色方式数(固定
n

如果
m=n
C(m)=C(m-1)+1+sum(C(m-i-1)表示i=n..m-1)
。重写此代码将给出
C(m)=1+C(m-1)+sum(C(i)表示i=0..(m-n-1))

只要小心一点,我们就可以在O(m)的时间和空间中计算它。需要注意的是,总和可以增量计算

这里有一种方法(python,但应该很容易转换为您想要的任何语言):


请阅读并至少展示一些你已经尝试过的东西。这是因为大多数问题给人的印象都是盲目的家庭作业,缺乏对你自己编程时遇到的具体编程问题的关注。要解决这个问题,请看看这里描述的折衷办法:当询问家庭作业时(1)注意你的学校政策:在这里寻求帮助可能构成作弊。(2)指定问题是家庭作业。(3)首先真诚地尝试自己解决问题(在问题中包含你的代码)。(4)询问您现有实现中的具体问题;请参阅。另外,是关于询问家庭作业问题的指南。
count(1,0)
的输出应该是
2
。您的算法给出了
3
@nimaheydarinaab。我认为您可以通过添加
n=max(n,1)来修复它
在函数的开头。是的,代码假定n>0。计数(1,0)
的输出应该是
2
。您的算法正确地给出了
1
@nimaheydarinaab,在
计数
的条件中犯了错误,我认为现在可以了。
def count(m, n):
    C = [0] * (m+1)
    s = 0
    for i in range(m+1):
        if i-n-1 >= 0:
            s += C[i-n-1]
        C[i] = 1 if i<n else C[i-1] + 1 + s
    return C[m]

print(count(7, 3))
def count(m, n):
    C = [0] * (n+1)
    s = 0
    for i in range(m+1):
        if i-n-1 >= 0:
            s += C[(i-n-1)%(n+1)]
        C[i%(n+1)] = 1 if i<n else C[(i+n)%(n+1)] + 1 + s
    return C[m%(n+1)]

print(count(7, 3))