uva 10918 Tri Tiling

本文探讨了一道编程题目,即使用无限数量的2*1小矩形拼凑成3*n的矩形,求解不同拼凑方案的数量。通过递推算法,从最小情况开始逐步构建解决方案,并最终输出任意给定n值对应的拼凑方案数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递推

参考:http://hi.baidu.com/gbr12345/item/b1686d3e4d2c5584b611db64

题意:输入n要拼成一个3*n的矩形,现有无限的2*1的小矩形可以提供,能有多少种不同的拼凑方案

这题一看就觉得是组合数字或者是递推,看了几下确定递推更好做。然后想了下怎么递推。1.就按照n从小到大来推,但是找不出什么规律。2.按照面积来递推,先凑出面积为2的,再面积为4,为6……然后对于3*n的面积是多少就直接输出即可,这种思想感觉非常接近了但是还是不行,因为处理不了重复的情况

最后无奈看了解题报告,不过还是不知道原作者怎么想到的这个递推公式

#include <cstdio>
#define N 35
long long dp[N],sum[N];

void init()
{
    dp[0]=1; dp[2]=3;
    sum[0]=1; sum[2]=4;
    for(int i=4; i<=30; i+=2)
    {
        dp[i]=3*dp[i-2]+2*sum[i-4];
        sum[i]=sum[i-2]+dp[i];
    }
    return ;
}

int main()
{
    int n;
    init();
    while(scanf("%d",&n)!=EOF && n!=-1)
        printf("%lld\n",dp[n]);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值