C 三瓷砖的解释和时间/空间复杂性

C 三瓷砖的解释和时间/空间复杂性,c,algorithm,math,big-o,combinatorics,C,Algorithm,Math,Big O,Combinatorics,我在理解下面的solve函数中到底发生了什么方面的问题。我看到了它的作用,但我仍然不清楚——我无法想象它,或者只是让自己去理解它。有人能解释一下吗 原始问题陈述(): 有多少种方法可以用2x1多米诺骨牌平铺3xn矩形 下面是3x12矩形的平铺示例 代码(摘自): #包括 int-dp[32]; 整数解算(整数n) { 如果(dp[n]!=-1) 返回dp[n]; 其他的 { int i; int res=3*求解(n-2); 对于(i=4;i从技术上讲,运行时是O(1),因为输入的大小有一个上

我在理解下面的solve函数中到底发生了什么方面的问题。我看到了它的作用,但我仍然不清楚——我无法想象它,或者只是让自己去理解它。有人能解释一下吗

原始问题陈述():

有多少种方法可以用2x1多米诺骨牌平铺3xn矩形

下面是3x12矩形的平铺示例

代码(摘自):

#包括
int-dp[32];
整数解算(整数n)
{
如果(dp[n]!=-1)
返回dp[n];
其他的
{
int i;
int res=3*求解(n-2);

对于(i=4;i从技术上讲,运行时是O(1),因为输入的大小有一个上限(具体来说是32)。但是让我们假设一分钟,问题的大小不超过32,并思考这个问题。在这种情况下,运行时是O(n2).在进行了某个大小的递归调用后,以后任何相同大小的递归调用都会在时间O(1)中运行。这是由于在
dp
表中使用了memonization。这意味着我们可以通过对所有可能的递归调用进行汇总来计算总运行时间,即填写
dp
表所需的时间量

对于大小为n的调用,填充数组需要做O(n)个功。从for循环可以看出这一点,该循环从4开始,在每个点上进行O(1)个功的计数,直到n乘以2。由于递归调用是针对大小为0、1、2、…、n的调用,所以我们有O(n)个调用分别进行O(n)个功,总共进行O(n2)个总功


希望这有帮助!

谢谢,我现在知道了复杂性。请你试着向我解释一下实际的算法是如何工作的(如果你理解的话)?:)我只需要知道solve函数中发生了什么,以及它如何能够像这样计算3x2n平铺问题的所有变化。
#include <stdio.h>
int dp[32];
int solve(int n)
{
    if(dp[n]!=-1)
        return dp[n];
    else
    {
        int i;
        int res = 3*solve(n-2);
        for(i=4;i<=n;i+=2)
            res+=2*solve(n-i);
        return dp[n]=res;
    }
}
int main()
{
    int i;
    for(i=0;i<32;i+=2)
        dp[i]=-1;
    for(i=1;i<32;i+=2)
        dp[i]=0;
    dp[0]=1;
    scanf("%d",&i);
    while(i!=-1)
    {
        printf("%d\n",solve(i));
        scanf("%d",&i);
    }
    return 0;
}