递推问题(NUBT1077—骨牌铺方格)

本文探讨了在2×n的长方形方格中使用1×2骨牌铺满的所有可能方案数量。通过分析不同大小的方格,得出递归公式a[n]=a[n-1]+a[n-2],并提供了实现这一算法的C语言代码。

1.NUBT1077—骨牌铺方格

 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 

例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

 

解题思路:

(1)首先我们观察2*1的情况,(如图(1))这种情况下只有这一种解决方案,水平与垂直只是放置问题:

(2)在研究2*2的情况,(如图(2)、(3))这种情况分为两种:

(3)以此类推,我们可以发现,首先设置a[n]数组来记录,a[1]=1,a[2]=2,表示2*1和2*2情况的个数,

可以发现递推公式:a[n]=a[n-1]+a[n-2]。

图(1)、(2)、(3)

主要代码:

#include<stdio.h>
int main()
{
  int i,x;
  long long int a[100];
  while(scanf("%d",&x)!=EOF)
  {
    a[1]=1;
    a[2]=2;
    for(i=3;i<=x;i++)
    {
      a[i]=a[i-1]+a[i-2];
    }
    printf("%I64d",a[x]);
  }
}

 

### L型骨牌方格 对于L型骨牌方格问题,可以将其视为一种特殊的多米诺骨牌覆盖问题。通常情况下,标准的2×1或多米诺骨牌覆盖问题是相对简单的组合计数问题,而引入L型骨牌会增加复杂度。 #### 递推关系建立 考虑一个大小为\(m \times n\)的矩形区域,其中\(m, n ≥ 2\)。如果允许使用L型骨牌以及可能的标准2×1骨牌,则需要构建合适的递推公式来解决此问题。然而,在给定资料中并没有直接提到如何处理带有L型骨牌的情况[^3]。因此,这里尝试基于已有信息扩展思路: - 对于最简单的情形——即仅含直立或平放的2×1骨牌时,已经建立了有效的递推公式\[f(n)=f(n−1)+f(n−2)\][^3]。 - 当加入L型骨牌后,情况变得更加多样化。假设存在某些特定位置能够容纳L型骨牌而不影响其他部分,则这些特殊布局也应被计入总的排列方式之中。 为了简化讨论并保持逻辑清晰,下面只针对宽度固定为2(即2xn)的情况下探讨解决方案,并假设有足够的空间让至少一对L型骨牌参与进来形成闭合路径或其他有效配置。 #### 动态规划求解策略 采用动态规划的思想,定义状态转移函数如下: 设`dp[i]`代表长度为i时的不同合法设方案总数; 则除了继承自传统两块砖头模式下的贡献外(`dp[i]=dp[i-1]+dp[i-2]`), 还需额外加上因新增加了L型组件所带来的可能性变化量Δ(i),具体取决于当前索引值及其前后关联性。 由于涉及到更复杂的几何形状匹配过程,实际编程实现上可能会比较棘手,尤其是当试图枚举所有潜在的有效L型拼接形态时。不过理论上讲,只要能穷尽所有合理的放置选项并将它们映射到相应的子问题规模上去,就能通过累加的方式更新最终的结果集。 ```cpp // C++ code snippet demonstrating the concept of adding L-shaped tiles into consideration. #include <iostream> using namespace std; long long dp[1005]; // Assuming maximum value for 'n' does not exceed 1004. void initDP(){ dp[0] = 1; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= 1004 ; ++i){ dp[i] = dp[i-1] + dp[i-2]; // Add contribution from possible placements of L-tiles here... // This part requires careful geometric analysis and may vary based on exact problem constraints. // For demonstration purposes only, this placeholder represents where you would add logic to account for L-shape contributions. // In practice, determining Δ(i) involves checking whether an L can fit at position i given previous states. } } int main() { int N; cin >> N; initDP(); cout << dp[N]<< endl; } ``` 上述代码片段展示了如何初始化基本的状态数组,并预留了一个占位符用于后续添加有关L型骨牌的具体计算逻辑。需要注意的是,这部分具体的增量计算依赖于详细的几何分析,这超出了现有参考资料所提供的范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值